0

次のようなコードを使用して、単純な要求/応答タイプのシナリオ (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つの別々に展開されたプロジェクトである場合、それらはとにかく異なるスレッドにあると思います.

4

1 に答える 1