質問

これはシンプルに見えますが、簡単な答えが見つかりません。

リモート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メッセージングに置き換えられました)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top