1

付属のOpenMQJMSキューを使用してGlassfish3.1.2にWebサービスを実装しようとしています。このキューは、応答の一時キューを使用して同期JMS要求/応答を実装します。リモートクライアントジョブ(コンテナの外部で実行)によってメインキューから取得されたメッセージを送信し、一時キューで応答を受信します。

基本的なJavaPOCでは、これは機能します。しかし、サーバー側のコードをコンテナーに入れると、機能しません。

メッセージがキューに送られ、ピックアップされないようにジョブをオフにし、QBrowserでキューを追跡します。

プロデューサーからメッセージを送信するだけで、キューに入れられ、ジョブで読み取ることができます。

しかし、応答を受信するコードを追加すると、メッセージはキューで読み取ることができなくなります。QBrowserは、キューに1つのメッセージがあると言っていますが、UnAckとマークされており、キューは空のように見えます(たとえば、メッセージが読み取れません)。

connectionFactoryとrequestQueueは、glassfishから@Resourceとして注入されます。メインキューはGlassfishで定​​義されています。

Webサービスの内部:

connection = connectionFactory .createConnection();
connection.start();

session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

MessageProducer producer = session.createProducer(requestQueue);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

MyObject myObj=new MyObject();
Message message=session.createObjectMessage(myObj);

TemporaryQueue responseQueue = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(responseQueue);

message.setJMSReplyTo(responseQueue);

producer.send(message);

//if I comment out the next line, the message appears on the queue. If I leave it in, it will behave as described above.
Message response=consumer.receive();

個別の接続とセッション、非同期コンシューマーなど、さまざまなアプローチを試し、プロデューサーのトランザクションセッションを試みましたが、コミットしようとしたときにのみスタックトレースを取得しました。

これを適切にキューに入れるために何が欠けていますか?

前もって感謝します!

編集:ConnectionFactoryおよびQueueのDomain.xml参照:

<connector-connection-pool description="Connection factory for job processing" name="jms/MyJobs" 
    resource-adapter-name="jmsra" connection-definition-name="javax.jms.ConnectionFactory" 
    transaction-support=""></connector-connection-pool>
<connector-resource pool-name="jms/MyJobs" jndi-name="jms/MyJobs"></connector-resource>
<admin-object-resource res-adapter="jmsra" res-type="javax.jms.Queue"
   description="Queue to request a job process" jndi-name="jms/MyJobRequest">
   <property name="Name" value="MyJobRequest"></property>
</admin-object-resource>

[...]

  <resource-ref ref="jms/MyJobs"></resource-ref>
  <resource-ref ref="jms/MyJobRequest"></resource-ref>
4

1 に答える 1

0

トランザクションの問題であることが判明しました。

新しいメソッドを追加して回避しました:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 
private void sendMessage(MessageProducer producer, Message message) throws Exception{   
         producer.send(message); 
}
于 2012-08-08T14:53:15.193 に答える