トランザクションセッションのサンプルプログラム

トランザクションセッションは、アプリケーションで特定のメッセージをグループ化する必要が生じた場合に使用されます。たとえば、アプリケーションで、メッセージの受信を確認して、1つのトランザクションで別のキューにいくつかの応答を送信する場合があります。このセクションには、次の2つのサンプルプログラムがあります。

トランザクション送信者

トランザクション受信者

1 TxSender

トランザクション送信者は、通常の非トランザクション送信者とは、次の2つの点で異なります。 TxSenderクラスの完全なソースは、次のとおりです。
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つの点を除いて、非トランザクション受信者に類似しています。 トランザクションメッセージ確認は、commitが呼び出されるたびに、commitへの最後の呼び出しから受信されたすべてのメッセージが確認されるという点で、CLIENT_ACKNOWLEDGEと同じように機能します。しかし、CLIENT_ACKNOWLEDGEとは逆に、トランザクションセッションをコミットすると、そのすべてのプロデューサおよびコンシューマに影響が与えられます。

トランザクションセッションのロールバックは、CLIENT_ACKNOWLEDGEを使用する受信者でrecoverメソッドを呼び出す場合に類似しています。commitへの最後の呼び出しから受信されたすべてのメッセージは、セッションのコンシューマに再配信されます。また、rollbackにより、前に説明したとおり、セッションのプロデューサにより送信されたすべてのメッセージが破棄されます。

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();
    }
}
TxReceiverは、通常の初期手順を実行して、メッセージの受信を開始します。ループは、「最後」のメッセージがキューに送信されるまで、メッセージの受信を繰り返します。最後のメッセージがキューに送信されると、セッションはコミットされ、コンシューマがすべての作業単位を受信したことが通知されます。

トップに戻る


Copyright © 2000-2003, Novell, Inc.All rights reserved.