2017-10-06 3 views
1

私は、Wildfly 10でJMS 2.0を使用して一時的なJMSキューを作成しようとしています。JEEサーバ(JMS)のJMS一時キューにリスナーを作成する方法はありますか。

@ JMSConnectionFactoryを使用してConnectionFactoryを注入しています。これは正常に動作します。また、一時的なキューを作成

@Inject @JMSConnectionFactory("java:/jms/RemoteConnectionFactory") JMSContext jmsContext 

が正常に動作します:

Destination jmsQueue = jmsContext.createTemporaryQueue(); 

がパブリッシャの作成と作品大丈夫、同様のメッセージを公開:

JMSProducer producer = jmsContext.createProducer(); 
TextMessage msg = jmsContext.createTextMessage(Long.toString(new Date().getTime())); 
producer.send(jmsQueue, msg); 

をしかし、どのように私はのためのリスナーを作成しますキュー? tempキューがあらかじめ定義されていないため、私はMDBを使用できません。私は消費者を作成しようと、それにメッセージリスナを割り当てた場合、私は、次のエラーメッセージが表示されます:

JMSConsumer consumer = jmsContext.createConsumer(jmsQueue); 
    consumer.setMessageListener(new MessageListener() { 
       ... 
       ... 
      }); 

エラートレース:

Caused by: javax.jms.IllegalStateException: This method is not applicable inside the application server. See the J2EE spec, e.g. J2EE1.4 Section 6.6 
     at org.apache.activemq.artemis.ra.ActiveMQRASession.checkStrict(ActiveMQRASession.java:1452) 
     at org.apache.activemq.artemis.ra.ActiveMQRAMessageConsumer.setMessageListener(ActiveMQRAMessageConsumer.java:123) 
     at org.apache.activemq.artemis.jms.client.ActiveMQJMSConsumer.setMessageListener(ActiveMQJMSConsumer.java:59) 

だから、私は明示的にメッセージを設定することはできませんように見えますリスナーはJEEで制御された接続ファクトリーを持ちます。しかし、それは一時的なキューであるため、MDBを作成することはできません。宛先はコンパイル時には分かっていないからです。だから、どのように私は一時的なキューを聞くのですか?

答えて

1

私はJMS 1.0を使用してこの問題を解決できました。私のようなコードに何かを持っていた:listenerClassjavax.jms.MessageListenerを実装するクラスがある

TopicConnectionFactory topicConnectionFactory; 
Topic topic; 
TopicConnection topicConnection; 

try { 
    InitialContext context = new InitialContext(); 
    topicConnectionFactory = (TopicConnectionFactory)jndi.lookup("jboss/DefaultJMSConnectionFactory"); 
    topic = (Topic)jndi.lookup("jms/myTopicName"); 

    topicConnection = topicConnectionFactory.createTopicConnection(); 

    TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 

    TopicSubscriber topicSubscriber = topicSession.createSubscriber(projectTopic, null, false); 
    topicSubscriber.setMessageListener(listenerClass); 
    topicConnection.start(); 
} 
... 

これは、Wildflyで定義されている定義済みのJMS接続ファクトリを利用して、standalone-full.xmlとなり、明示的に設定する必要はありません。

警告として、最後に私はこのコードをWildfly 8に搭載していたので、いくつかのことが少し変わったかもしれません。また、私はリモート接続を使用していないので、やはりいくつかの違いがあるかもしれません。

+0

ありがとうございました - 私もそれを試みましたが、同じ例外がスローされました。クライアントがJMS2またはJMS1ファサードを使用しているかどうかにかかわらず、同じActiveMARASessionをまだ使用しているため、特に驚くことはありません。私はこれに論理的な解決策がないと想像することはできません。 –

+0

なぜ一時的なキューが必要なのですか?コンテナがデプロイメントの存続期間中にmdbインスタンスを提供することを期待している場合は、そのキューも存在する必要があります。 –

+0

@willtクラスタの各ノードに固有のパブリッシュ/サブスクライブキューが必要です。キューはランタイムの存続期間中存続しなければなりませんでした。再起動を継続する必要はありません。さらに、これらのキューを手動で管理する必要もありません。したがって、一時的な待ち行列の考え方...しかし、それを聞く方法がない場合、一時待ち行列の目的はどれくらいですか? @ EricB。 –

関連する問題