4

これは単純に見えますが、単純な答えを見つけることができません。

リモートJMSブローカーへの接続を開き(IPとポートは既知)、特定のキュー(名前は既知)へのセッションを開き、このキューにメッセージを送信したいと思います。

それを行うための単純なJavaAPI(可能であれば標準)はありますか?


編集

さて、JMSはJDBCと同じようにドライバー仕様であり、私が思っていたような通信プロトコルではないことを理解しました。

JBossで実行しているので、 JBossConnectionFactoryを作成する方法がまだわかりません。


編集

私は実際に問題にいくつかの考えを与えました(うーん)。JMSをJDBCと同じように扱う必要がある場合は、MQ実装によって提供されるクライアントを使用する必要があります。ブローカーにSonicMQを使用しているため、SonicMQで提供されるsonic_Client.jarライブラリを埋め込むことにしました。

これは、スタンドアロンのJavaアプリケーションとJBossサービスで機能します。

助けてくれてありがとう

4

3 に答える 3

4

JMSを使用し、を作成してQueueConnectionFactoryそこから移動する必要があります。正確に作成する方法はQueueConnectionFactoryベンダー固有です(JMSは基本的にJDBCがデータベース用であるのと同じように、メッセージキューのドライバー仕様です)が、IBMMQでは次のようになります。

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.xmlorg.jboss.mq.server.jmx、JBossキューに関連して作成する必要のあるMBeanが表示されます。

于 2009-06-24T10:50:18.040 に答える
0

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();
        }
    }
}
于 2009-06-24T13:55:10.567 に答える
0

実際、私は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メッセージングに置き換えられました)。

于 2013-01-08T15:38:34.110 に答える