Hello Worldアプリケーションは、「Hello」メッセージをキューに送信する送信者アプリケーションで構成されます。このメッセージは、メッセージが送信されたキューに接続している1つのキュー受信者により受信されます。接続している受信者がない場合、メッセージはキューに保持されます。複数の受信者が接続している場合、メッセージは、ラウンドロビン方式で受信されます。
このセクションには、次の4つのサンプルプログラムがあります。
このセクションの例では、例外を処理するコードは示されていません。 この結果、サンプルコードは読みやすくなりますが、アプリケーションプログラマの方は、JMSプロイダに障害が発生した場合、JMS APIのほとんどすべてのメソッドでJMSExceptionが発生する可能性があることに注意してください。1 キュー送信者
キュー送信者アプリケーションは、次の手順を実行します。送信者アプリケーションの完全なソースコードは、次のとおりです。
- JMSサーバのInitialContextオブジェクトを取得します。
- コンテキストオブジェクトを使用して、特定のキュー(この場合「queue0」)を参照します。
- コンテキストオブジェクトを使用して、キュー接続ファクトリを参照します。ルックアップで「queue/connectionFactory」を指定することのみが必要となります。これは、このサンプルの実行元であるバッチファイルにより、システムネームスペースの該当するルートコンテキストを参照するようにシステムプロパティが設定されているためです。 Novell eXtend Application ServerでJMSサーバを使用している場合、ルックアップを次のように指定する必要があります。
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx. lookup("iiop://localhost:3506/queue/connectionFactory");- QueueConnectionFactoryを使用して、QueueConnectionを作成します。このQueueConnectionは、JMSサーバとの物理的な接続を示します。
- キューセッションを作成します。createQueueSessionメソッドの最初のパラメータは、セッションが処理されるかどうかを決めます。ここでは、処理されないセッションを使用します。2番目のパラメータは、配信モードを決めます。これは、送信側アプリケーションでは使用されません。
- queue0のキュー送信者を作成し、メッセージを作成します。
- 「Hello」メッセージをqueue0に送信します。
- キュー接続を閉じます。セッションとQueueSenderの両方が閉じます。
Senderクラスは、メッセージを送信する前に、配信モードをpackage pointToPoint; 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 Sender { 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(false, | Session.DUPS_OK_ACKNOWLEDGE); | | // create a queue sender | QueueSender queueSender = queueSession.createSender(queue); | queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT); | | // create a simple message to say "Hello" | TextMessage message = queueSession.createTextMessage("Hello"); | | // send the message | queueSender.send(message); | | // print what we did | System.out.println("sent: " + message.getText()); | | // close the queue connection | queueConn.close(); } }NON_PERSISTENT
に設定します。つまり、JMSサーバがクラッシュした場合、メッセージは失われます。NON_PERSISTENT
メッセージは、PERSISTENT
メッセージを使用した場合よりパフォーマンス上優れているため、確実な配信が必要ない場合、アプリケーションで、配信モードをNON_PERSISTENT
に設定する必要があります。2 同期キュー受信者
受信アプリケーションは、キュー送信者と同じ初期手順を実行します。これは、ここで示すように、常に初期コンテキストを使用してキューオブジェクトを検出し、キューに接続して、セッションを作成する必要があるからです。
QueueSender
オブジェクトの代わりに、受信者アプリケーションは、メッセージが同期受信されるQueueReceiver
を作成します。受信者アプリケーションは、メッセージが受信される前に接続を開始する必要があることに注意してください。受信者アプリケーションは、自動メッセージ確認で処理されないセッションを使用します。つまり、receiveメソッドがメッセージをアプリケーションに返す直前に、セッションによりメッセージが自動的に確認されます。
Receiverクラスのソースは、次のとおりです。
接続が開始されない場合、package pointToPoint; 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 Receiver { 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(false, | Session.AUTO_ACKNOWLEDGE); | | // create a queue receiver | QueueReceiver queueReceiver = queueSession.createReceiver(queue); | | // start the connection | queueConn.start(); | | // receive a message | TextMessage message = (TextMessage) queueReceiver.receive(); | | // print the message | System.out.println("received: " + message.getText()); | | // close the queue connection | queueConn.close(); } }receive
メソッドは永久的に(または他のスレッドにより接続が開始されるまで)ブロックされます。クライアントが、メッセージの配信を一時停止したい場合、接続を停止して、後で再開できます。3 非同期キュー受信者
AsyncReceiverクラスは、メッセージリスナの使用を示します。メッセージリスナは、MessageListenerインタフェースを実装する通常のJavaクラスです。このインタフェースには、1つのonMessageメソッドがあり、メッセージが宛先に送信されたときにJMSにより呼び出されます。同期受信者と同様に、AsyncReceiverクラスは、同じ初期手順を実行し、QueueReceiverを作成します。次に、setMessageListenerメソッドが呼び出され、
this
がメッセージリスナとして登録されます。同期受信者と同様に、startメソッドが接続で呼び出されるまで、メッセージは送信されません。確認モードは自動に設定されているので、JMSは、onMessageメソッドへの呼び出しが返された直後にメッセージを確認します。onMessageは、例外をスローできないことに注意してください。そのため、すべての例外を捕捉し、onMessageメソッドで処理する必要があります。
同期受信者では、JMSに障害が発生した場合、
receive
メソッドは、例外を発生できます。非同期のこのような性質により、これは、メッセージリスナでは不可能です。そのため、例外リスナを接続で登録することができます。これにより、このような例外を検出できます。
AsyncReceiver
クラスの完全なソースは、次のとおりです。ソースコードに示されているように、非同期メッセージリスナを使用する場合、接続例外リスナを必ず設定することをお勧めします。この結果、JMSサーバのクラッシュなど、あらゆるランタイム問題を検出できます。package pointToPoint; import javax.naming.InitialContext; import javax.jms.Queue; import javax.jms.Session; import javax.jms.Message; import javax.jms.TextMessage; import javax.jms.MessageListener; import javax.jms.JMSException; import javax.jms.ExceptionListener; import javax.jms.QueueSession; import javax.jms.QueueReceiver; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; public class AsyncReceiver implements MessageListener, ExceptionListener { 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(false, | Session.AUTO_ACKNOWLEDGE); | | // create a queue receiver | QueueReceiver queueReceiver = queueSession.createReceiver(queue); | | // set an asynchronous message listener | AsyncReceiver asyncReceiver = new AsyncReceiver(); | queueReceiver.setMessageListener(asyncReceiver); | | // set an asynchronous exception listener on the connection | queueConn.setExceptionListener(asyncReceiver); | | // start the connection | queueConn.start(); | | // wait for messages | System.out.print("waiting for messages"); | for (int i=0; i < 10; i++) { | | Thread.sleep(1000); | | System.out.print("."); | } | System.out.println(); | | // close the queue connection | queueConn.close(); } /** This method is called asynchronously by JMS when a message arrives at the queue.Client applications must not throw any exceptions in the onMessage method. @param message A JMS message. */ public void onMessage(Message message) { | TextMessage msg = (TextMessage) message; | try { | | System.out.println("received: " + msg.getText()); | } catch (JMSException ex) { | | ex.printStackTrace(); | } } /** This method is called asynchronously by JMS when some error occurs. When using an asynchronous message listener it is recommended to use an exception listener also since JMS have no way to report errors otherwise. @param exception A JMS exception. */ public void onException(JMSException exception) { | System.err.println("an error occurred:" + exception); } }JMSException APIは、
getLinkedException
メソッドをサポートしています。これは、例外(存在する場合)の原因を判別するときに使用できます。たとえば、onMessageメソッドでRuntimeExceptionが発生した場合、リンクしている例外は、onExceptionが呼び出される際に、このランタイム例外になります。4 キューブラウザ
キューブラウザは、メッセージを使用せずにキューを参照するために使用できます。キューブラウザは、JMSクライアントアプリケーションと同じ初期手順を実行します。つまり、QueueBrowserオブジェクトのファクトリであるセッションオブジェクトを取得します。QueueBrowserは、イテレータをサポートしており、これは、キューのメッセージを列挙する際に使用できます。キューのメッセージ数を数える方法は、次の例のとおりです。確認モードは、キューブラウザでは重要ではありません。
この列挙で返されるメッセージの順序は、通常のメッセージ受信者が参照する順序と同じです。キューブラウザは、キューのスタティックスナップショットを表示します。参照中にメッセージがキューに追加されても、これらは、キューブラウザでは使用できません。package pointToPoint; import java.util.Enumeration; import javax.naming.InitialContext; import javax.jms.Queue; import javax.jms.Session; import javax.jms.Message; import javax.jms.QueueSession; import javax.jms.QueueBrowser; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; public class Browser { 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(false, | Session.AUTO_ACKNOWLEDGE); | | // create a queue browser | QueueBrowser queueBrowser = queueSession.createBrowser(queue); | | // start the connection | queueConn.start(); | | // browse the messages | Enumeration e = queueBrowser.getEnumeration(); | int numMsgs = 0; | | // count number of messages | while (e.hasMoreElements()) { | | Message message = (Message) e.nextElement(); | | numMsgs++; | } | | System.out.println(queue + " has " + numMsgs + " messages"); | | // close the queue connection | queueConn.close(); } }
Copyright © 2000-2003, Novell, Inc.All rights reserved. |