JBossを使用してメッセージをリモートJMSキューに投稿する
-
10-07-2019 - |
質問
これはシンプルに見えますが、簡単な答えが見つかりません。
リモートJMSブローカー(IPとポートが既知)への接続を開き、特定のキュー(名前は既知)へのセッションを開き、このキューにメッセージを投稿したい。
それを行うための単純なJava API(可能であれば標準)はありますか?
編集
OK私は、JMSがJDBCのようなドライバー仕様であり、思ったとおりの通信プロトコルではないことを理解しました。
JBossで実行しているのに、 JBossConnectionFactory 。
編集
実際に問題にいくつかの考え(hmmm)を与えました。JMSをJDBCと同じように扱う必要がある場合は、MQ実装によって提供されるクライアントを使用する必要があります。ブローカーにSonicMQを使用しているため、SonicMQで提供されるsonic_Client.jarライブラリを埋め込むことにしました。
これは、スタンドアロンJavaアプリケーションおよびJBossサービスで動作しています。
助けてくれてありがとう
解決
JMSを使用し、 QueueConnectionFactory
を作成してそこから進む必要があります。正確に QueueConnectionFactory
を作成する方法はベンダー固有です(JMSは基本的にJDBCがデータベース用であるのと同じようにメッセージキュー用のドライバー仕様です)が、IBM MQでは次のようになります:
MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
connectionFactory.setHostName(<hostname>);
connectionFactory.setPort(<port>);
connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
connectionFactory.setQueueManager(<queue manager>);
connectionFactory.setChannel("SYSTEM.DEF.SVRCONN");
QueueConnection queueConnection = connectionFactory.createQueueConnection();
QueueSession queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = queueSession.createQueue(<queue name>);
QueueSender queueSender = session.createSender(queue);
QueueReceiver queueReceiver = session.createReceiver(queue);
編集(質問の編集後)
リモートキューまたはその他のキューにアクセスする最良の方法は、 Queue
インスタンスをJNDIレジストリに追加することです。リモートキューの場合、これは、サーバーの起動時に Queue
インスタンスを追加するMBeanを使用して実現されます。
http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4をご覧くださいは、IBM MQを使用した例ですが、基本的にはリモートキューに接続するために必要なことです。
jbossmq-destinations-service.xml
および org.jboss.mq.server.jmx
を見ると、リレーションで作成する必要のあるMBeanが表示されます。 JBossキューへ。
他のヒント
sonic_Client.jar
ライブラリを使用してSonicMQブローカーに接続するために使用したコードは次のとおりです。
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
public class JmsClient
{
public static void main(String[] args) throws JMSException
{
ConnectionFactory factory = new progress.message.jclient.ConnectionFactory("tcp://<host>:<port>", "<user>", "<password>");
Connection connection = factory.createConnection();
try
{
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
try
{
MessageProducer producer = session.createProducer(session.createQueue("<queue>"));
try
{
producer.send(session.createTextMessage("<message body>"));
}
finally
{
producer.close();
}
}
finally
{
session.close();
}
}
finally
{
connection.close();
}
}
}
実際、JBoss 4を使用していますが、JNDIの使用は難しくありません。
まず、JNDIが実行されている場所を知る必要があります。
JBoss(conf \ jboss-service.xml)に以下があります:
<mbean code="org.jboss.naming.NamingService" name="jboss:service=Naming" xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
...
<attribute name="Port">7099</attribute>
...
</mbean>
これは重要です。これは接続するポートです。
これで、次のコードを使用して簡単にJNDIに接続できます。
Hashtable<String, String> contextProperties = new Hashtable<String, String>();
contextProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
contextProperties.put(Context.PROVIDER_URL, "jnp://localhost:7099");
InitialContext initContext = new InitialContext(contextProperties);
コンテキストがある場合、@ Nick Holtの答えに非常に似ていますが、接続ファクトリの作成を除いて、使用する必要があります:
QueueConnectionFactory connFactory = (QueueConnectionFactory) initContext.lookup("ConnectionFactory");
また、いくつかデプロイされている場合、キューを作成する必要はありません
Queue queue = (Queue) initContext.lookup("queueName");
上記のすべてのコードは、JBoss 4.2.2 GAおよびJBossMQでテストされています(JBossMQは、正しい場合は4.2.3でJBossメッセージングに置き換えられました)。