0

アクティブな MQ キューからメッセージを受信して​​います。

一度に複数のメッセージを受信する方法はありますか? それともループで行う必要がありますか?

さらに、30 個のメッセージを取得したい場合は、プロシージャを実行し、そのプロシージャが機能する場合にのみ、 message.acknowledge();それらすべてに対して a を返します。

つまり、手順が失敗した場合にキューから 30 個を消去したくないということです。

ありがとう。

4

2 に答える 2

2

ループでそれを行う必要があります。通常、メッセージの消費にはメッセージ駆動型 Bean を使用するのが最善ですが、この場合には適していません。メッセージごとにメッセージを受け取り、正確な数を指定できないためです。したがって、使用MessageConsumerおよび手動トランザクション:

@Resource
UserTransaction utx;

@Resource(mappedName="jms/yourConnectionFactory");
ConnectionFactory cf;

@Resource(mappedName="jms/yourQueue");
Queue queue;

..    
Connection conn = null;
Session s = null;
MessageConsumer mc = null;
try {
    utx.begin();
    conn = cf.createConnection();
    s = conn.createSession(true, Session.CLIENT_ACKNOWLEDGE); //TRANSACTIONAL SESSION!
    mc = s.createConsumer(queue);
    conn.start(); // START CONNECTION'S DELIVERY OF INCOMING MESSAGES
    for(int i=0; i<30; i++)
    {
          Message msg = mc.receive();
          //BUSINESS LOGIC
    }
    utx.commit();
} catch(Exception ex) {
  ..
} finally { //CLOSE CONNECTION, SESSION AND MESSAGE CONSUMER
}
于 2012-11-28T08:18:39.253 に答える
0

ActiveMQ の経験はありません。しかし、キューリスナーの場合、基本的なロジックはキューの実装に関係なく同じであるべきだと思います。

最初の質問については、キューから複数のメッセージを取得する方法がわかりません。ループ内で1つずつ取得するのが最善の方法だと思います。

2 番目の質問では、メッセージを読み取った基になるトランザクションがコミットされるまで、メッセージはキューから破棄されません。したがって、1 つのトランザクションで大量のメッセージを読み取り、エラーが発生した場合はロールバックできます。キューから既存のメッセージを消去するべきではありません。

手順を実行するのに 30 個のメッセージが必要な理由をお尋ねしてもよろしいですか。通常、キューを使用する場合、各メッセージは個別に処理できる必要があります。

于 2012-11-28T08:40:33.420 に答える