2

スイングの重いクライアント (Apache ActiveMQ ライブラリを使用) から、デフォルトの JMS プロバイダーとして OpenMQ を使用していると思われる Glassfish サーバーのインスタンスにテキスト メッセージを送信しようとしています。

クライアントに使用している非常にソースの基本的なコードの下:

try {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("jms/SaisieQueueFactory");
    connectionFactory.setBrokerURL("tcp://localhost:27676");
    Connection connection = connectionFactory.createConnection();
    connection.start();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Destination destination = session.createQueue("jms/SaisieQueue");
    MessageProducer producer = session.createProducer(destination);
    producer.setDeliveryMode(DeliveryMode.PERSISTENT);
    TextMessage message = session.createTextMessage("Score + 1");
    producer.send(message);
    session.close();
    connection.close();
} catch(Exception ex) {
    ex.printStackTrace();
}
  • Glassfish サーバーの管理コンソール (JMS_PROVIDER_PORT) のシステム プロパティでブローカー ポートを見つけました。
  • MessageDrivenBean をデプロイしたときに、キュー接続ファクトリとキューが作成されました。
  • 今のところ、クライアントとグラスフィッシュ インスタンスは同じコンピューターで実行されていますが、2 つの異なるマシンで動作させたいと考えています (そのため、トランスポート プロトコルとして vm:// を使用していません)。

私はこれらの例外を得ました:

javax.jms.JMSException: Cannot send, channel has already failed: tcp://127.0.0.1:7676
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1395)
    at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1481)
    at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:516)
    at testdate.TestDate.main(TestDate.java:44)
Caused by: org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed: tcp://127.0.0.1:7676
    at org.apache.activemq.transport.AbstractInactivityMonitor.doOnewaySend(AbstractInactivityMonitor.java:282)
    at org.apache.activemq.transport.AbstractInactivityMonitor.oneway(AbstractInactivityMonitor.java:271)
    at org.apache.activemq.transport.TransportFilter.oneway(TransportFilter.java:85)
    at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:104)
    at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68)
    at org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:81)
    at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:86)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1366)
    ... 3 more
  • Glassfish インスタンスの JMS プロバイダーを ActiveMQ に変更する解決策を検討しましたが、可能であれば OpenMQ を維持したいと考えています。

PS: 私は JMS と Java EE フレームワークの初心者です。

4

2 に答える 2

3

JMS API は、メッセージング用の Java インターフェイスとアーキテクチャを定義します。特定のワイヤ プロトコルは定義しません。伝書鳩、メモリ内、または一般的な形式 (STOMP、OpenWire、AMQP、MQTT) のいずれかである可能性があります。

クライアントで代わりに Open MQ ライブラリを使用できないのはなぜですか? これが JMS の設計方法です。.jar ファイルから切り替えて、.jar ファイルを変更するだけで済みますConnectionFactory

ActiveMQ JMS クライアントを使用するためだけに ActiveMQ に切り替える理由はありません。Open MQ クライアントとほとんど同じはずだからです。ただし、サーバー側の機能が異なるなど、切り替える理由は他にもありますが、それについては言及していません。

つまり、STOMP プロトコル (ActiveMQ がサポート) を介して任意の JMS サーバーを公開できるブリッジ コンポーネントがあります。

これはStomp Connectと呼ばれ、OpenMQ ページにかなり古い使用方法の説明があります。

そこから、STOMP を指定して ActiveMQConnection ファクトリに接続できるはずです。しかし、私は実際にこの組み合わせを自分で試したことはありません.

于 2013-02-13T05:45:29.943 に答える
2

AcitveMQ JMSクライアントは、ActiveMQサーバーとのみ通信できます。OpenMQ JMSクライアントを使用して、OpenMQサーバーと通信します。

于 2013-02-12T19:29:22.077 に答える