次のようなコードを使用して、単純な要求/応答タイプのシナリオ (Glassfish を使用する JavaEE 7/Netbeans 7) をセットアップしました。
これは、JMS プロデューサーの役割
destination
を実行するステートレス セッション Bean でありfactory
、EJB に注入されます。
public void doStuff(int id) {
try {
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
ObjectMessage message = session.createObjectMessage();
MyObject obj = new MyObject(id);
connection.start();
TemporaryQueue replyQueue = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(replyQueue);
message.setJMSReplyTo(replyQueue);
message.setObject(obj);
producer.send(message, DeliveryMode.PERSISTENT, Message.DEFAULT_PRIORITY, 1800000);
Message reply = consumer.receive();
producer.close();
session.close();
connection.close();
} catch (JMSException ex) {
}
}
私の問題は、consumer.receive()
が呼び出されると、期待どおりに実行がブロックされることですが、このメッセージの消費者は決して実行されません。元のメッセージのコンシューマー (MDB) は、同じ Glassfish サーバーにデプロイされた別の netbeans プロジェクトにあります。
両方のプロジェクト (プロデューサーとコンシューマーの両方) をデバッグしようとしましたが、私のプロデューサー プロジェクトがブロックされている間、私のコンシューマー プロジェクトは何もしていないようです。
consumer.recieve()
そのようなものに変更するとconsumer.receive(20000)
、予想どおり20秒間何も起こりませんが、タイムアウトが突然期限切れになるとすぐに、消費者プロジェクトでデバッガーブレークポイントがヒットし、通常どおりに処理されます。しかしもちろん、私のプロデューサー プロジェクトはもうリッスンしていないので、返信はありません。
私の他のプロジェクト (消費者プロジェクト) は次のようになります。
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/myQueue")
})
---------------------
@Override
public void onMessage(Message message) {
try {
ObjectMessage objMessage = (ObjectMessage) message;
MyObject obj = (MyObject) objMessage.getObject();
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(message.getJMSReplyTo());
connection.start();
try {
myMethod(obj);
} catch (Exception e) {
Message response = session.createTextMessage(e.getMessage());
producer.send(message.getJMSReplyTo(), response);
}
} catch (JMSException ex) {
}
}
receive() メソッドを正しく動作させるにはどうすればよいですか? 返信のために一時停止する必要がありますが、一時停止している間、他のプロジェクトが作業を継続する必要があります.2つの別々に展開されたプロジェクトである場合、それらはとにかく異なるスレッドにあると思います.