アクティブな MQ キューからメッセージを受信しています。
一度に複数のメッセージを受信する方法はありますか? それともループで行う必要がありますか?
さらに、30 個のメッセージを取得したい場合は、プロシージャを実行し、そのプロシージャが機能する場合にのみ、 message.acknowledge();
それらすべてに対して a を返します。
つまり、手順が失敗した場合にキューから 30 個を消去したくないということです。
ありがとう。
アクティブな MQ キューからメッセージを受信しています。
一度に複数のメッセージを受信する方法はありますか? それともループで行う必要がありますか?
さらに、30 個のメッセージを取得したい場合は、プロシージャを実行し、そのプロシージャが機能する場合にのみ、 message.acknowledge();
それらすべてに対して a を返します。
つまり、手順が失敗した場合にキューから 30 個を消去したくないということです。
ありがとう。
ループでそれを行う必要があります。通常、メッセージの消費にはメッセージ駆動型 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
}
ActiveMQ の経験はありません。しかし、キューリスナーの場合、基本的なロジックはキューの実装に関係なく同じであるべきだと思います。
最初の質問については、キューから複数のメッセージを取得する方法がわかりません。ループ内で1つずつ取得するのが最善の方法だと思います。
2 番目の質問では、メッセージを読み取った基になるトランザクションがコミットされるまで、メッセージはキューから破棄されません。したがって、1 つのトランザクションで大量のメッセージを読み取り、エラーが発生した場合はロールバックできます。キューから既存のメッセージを消去するべきではありません。
手順を実行するのに 30 個のメッセージが必要な理由をお尋ねしてもよろしいですか。通常、キューを使用する場合、各メッセージは個別に処理できる必要があります。