トランザクションセッションは、アプリケーションで特定のメッセージをグループ化する必要が生じた場合に使用されます。たとえば、アプリケーションで、メッセージの受信を確認して、1つのトランザクションで別のキューにいくつかの応答を送信する場合があります。このセクションには、次の2つのサンプルプログラムがあります。1 TxSender
トランザクション送信者は、通常の非トランザクション送信者とは、次の2つの点で異なります。TxSenderクラスの完全なソースは、次のとおりです。
- セッションを作成する場合、
createQueueSession
メソッドの最初のパラメータは、トランザクションセッションを使用するためtrueに設定されます。- メッセージの送信または削除は、それぞれセッションの
commit
およびrollback
メソッドを使用して、制御されます。メッセージは、セッションがコミットされるまで、「送信されません」。一般的にメッセージプロデューサでは、セッションの確認モードは使用されません。 この例では、配信モードをpackage txSession; import javax.naming.InitialContext; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.QueueSender; import javax.jms.DeliveryMode; import javax.jms.QueueSession; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; public class TxSender { public static void main(String[] args) throws Exception { | // get the initial context | InitialContext ctx = new InitialContext(); | | // lookup the queue object | Queue queue = (Queue) ctx.lookup("queue/queue0"); | | // lookup the queue connection factory | QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx. | lookup("queue/connectionFactory"); | | // create a queue connection | QueueConnection queueConn = connFactory.createQueueConnection(); | | // create a queue session | QueueSession queueSession = queueConn.createQueueSession(true, | Session.DUPS_OK_ACKNOWLEDGE); | | // create a queue sender | QueueSender queueSender = queueSession.createSender(queue); | queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT); | | TextMessage part1 = queueSession.createTextMessage("part one"); | TextMessage part2 = queueSession.createTextMessage("part two"); | TextMessage part3 = queueSession.createTextMessage("part three"); | TextMessage last = queueSession.createTextMessage("final"); | | queueSender.send(part1); | queueSender.send(part2); | queueSender.send(part3); | queueSender.send(last); | | // commit the send (actually put messages on queue) | queueSession.commit(); | | System.out.println("TxSender committed 4 messages"); | | // close the queue connection | queueConn.close(); } }NON_PERSISTENT
に設定しています。つまり、4つのメッセージは永続的ではありませんが、1つの作業単位でターゲットキューに置かれます。Novell exteNd Messaging Platformの JMSサーバでは、トランザクションメッセージプロデューサの持続メッセージは、1つのデータベーストランザクションでデータベースに入ります。これにより、トランザクションセッションの絶対的なセマンティクが保証されます。コミットが成功すると、すべてのメッセージは確実に配信されます。
2 TxReceiver
トランザクション受信者は、次の2つの点を除いて、非トランザクション受信者に類似しています。トランザクションメッセージ確認は、
- 送信者の場合と同様に、
createQueueSession
メソッドの最初パラメータは、トランザクションセッションを使用するためtrueに設定されます。2番目の引数は無視されます。- メッセージの確認は、セッションの
commit
メソッドおよびrollback
メソッドを使用して、制御されます。commit
が呼び出されるたびに、commit
への最後の呼び出しから受信されたすべてのメッセージが確認されるという点で、CLIENT_ACKNOWLEDGEと同じように機能します。しかし、CLIENT_ACKNOWLEDGEとは逆に、トランザクションセッションをコミットすると、そのすべてのプロデューサおよびコンシューマに影響が与えられます。トランザクションセッションのロールバックは、CLIENT_ACKNOWLEDGEを使用する受信者で
recover
メソッドを呼び出す場合に類似しています。commit
への最後の呼び出しから受信されたすべてのメッセージは、セッションのコンシューマに再配信されます。また、rollback
により、前に説明したとおり、セッションのプロデューサにより送信されたすべてのメッセージが破棄されます。TxReceiverクラスのソースは、次のとおりです。
TxReceiverは、通常の初期手順を実行して、メッセージの受信を開始します。ループは、「最後」のメッセージがキューに送信されるまで、メッセージの受信を繰り返します。最後のメッセージがキューに送信されると、セッションはコミットされ、コンシューマがすべての作業単位を受信したことが通知されます。package txSession; import javax.naming.InitialContext; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.QueueSession; import javax.jms.QueueReceiver; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; public class TxReceiver { public static void main(String[] args) throws Exception { | // get the initial context | InitialContext ctx = new InitialContext(); | | // lookup the queue object | Queue queue = (Queue) ctx.lookup("queue/queue0"); | | // lookup the queue connection factory | QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx. | lookup("queue/connectionFactory"); | | // create a queue connection | QueueConnection queueConn = connFactory.createQueueConnection(); | | // create a queue session | QueueSession queueSession = queueConn.createQueueSession(true, | Session.AUTO_ACKNOWLEDGE); | | // create a queue receiver | QueueReceiver queueReceiver = queueSession.createReceiver(queue); | | // start the connection | queueConn.start(); | | while (true) | { | | TextMessage msg = (TextMessage) queueReceiver.receive(); | | System.out.println(msg.getText()); | | if (msg.getText().equals("final")) | | { | | | queueSession.commit(); // acknowledge all | | | break; | | } | } | | // close the queue connection | queueConn.close(); } }
Copyright © 2000-2003, Novell, Inc.All rights reserved. |