Oracle® Fusion Middleware Oracle WebLogic Server Microsoft .NET 対応の WebLogic JMS クライアントの使用 11g リリース 1 (10.3.1) B55555-01 |
|
戻る |
以下の C# で記述された .NET クライアント サンプル プログラムでは、WebLogic JMS .NET API の基本的な機能の概要を示します。API の詳細については、『.NET クライアント用の WebLogic メッセージング API リファレンス 』マニュアルを参照してください。
コード リスト A-1 MessagingSample.cs
using System; using System.Collections; using System.Collections.Generic; using System.Threading; using WebLogic.Messaging; /// <summary> WebLogic JMS .NET API を例示する。 /// <para> /// このコマンドライン プログラムは WebLogic JMS に接続して、 /// キューとトピックのメッセージング処理を実行する。 /// バージョン 10g リリース 3 以降でサポートされる。プログラムをコンパイルするには、 ///「WebLogic.Messaging.dll」にリンクする。使用方法の情報については、 ///「-help」をパラメータとして指定してプログラムを実行する。 /// </para> /// <para> /// Copyright 1996,2008, Oracle and/or its affiliates. All rights reserved. /// </para> /// </summary> public class MessagingSample { private static string NL = Environment.NewLine; private string host = "localhost"; private int port = 7001; private string cfName = "weblogic.jms.ConnectionFactory"; private string queueName = "jms.queue.TestQueue1"; private string topicName = "jms.topic.TestTopic1"; private static string USAGE = "Usage: " + Environment.GetCommandLineArgs()[0] + NL + " [-host <hostname>] [-port <portnum>] " + NL + " [-cf <connection factory JNDI name>] " + NL + " [-queue <queue JNDI name>] [-topic <topic JNDI name>]"; public static void Main(string[] args) { try { MessagingSample ms = new MessagingSample(); // コマンドライン引数でデフォルトをオーバーライドする。 if (!ms.ParseCommandLine(args)) return; ms.DemoSyncQueueReceiveWithAutoAcknowledge(); ms.DemoAsyncNondurableTopicConsumerAutoAcknowledge(); ms.DemoSyncTopicDurableSubscriberClientAcknowledge(); } catch (Exception e) { Console.WriteLine(e); } } private void DemoSyncQueueReceiveWithAutoAcknowledge() { Console.WriteLine( NL + "-- DemoSyncQueueReceiveWithAutoAcknowledge -- " + NL); // ------------------------------------------------ // WebLogic へのネットワーク接続を確立してログインする。 // ------------------------------------------------ IDictionary<string, Object> paramMap = new Dictionary<string, Object>(); paramMap[Constants.Context.PROVIDER_URL] = "t3://" + this.host + ":" + this.port; IContext context = ContextFactory.CreateContext(paramMap); try { // ------------------------------------- // コンテキストでリソースをルックアップする。 // ------------------------------------- IConnectionFactory cf = context.LookupConnectionFactory(this.cfName); IQueue queue = (IQueue)context.LookupDestination(this.queueName); // ------------------------------------------------- // 接続ファクトリを使用して接続を作成する。 // ------------------------------------------------- IConnection connection = cf.CreateConnection(); // ----------------------------------------------------------------- // 受信側がメッセージを取得できるように接続を開始する。 // ----------------------------------------------------------------- connection.Start(); // ----------------- // セッションを作成する。 // ----------------- // 重要 : セッションはスレッドセーフではない。プロデューサとコンシューマを // 同時に実行する必要がある場合は、複数のセッションを使用する。詳細については、 // 以下の非同期コンシューマ例を参照する。 // ISession session = connection.CreateSession( Constants.SessionMode.AUTO_ACKNOWLEDGE); // ------------------------------------------------ // プロデューサを作成して永続メッセージを送信する。 // ------------------------------------------------ IMessageProducer producer = session.CreateProducer(queue); producer.DeliveryMode = Constants.DeliveryMode.PERSISTENT; ITextMessage sendMessage = session.CreateTextMessage("My q message"); producer.Send(sendMessage); PrintMessage("Sent Message:", sendMessage); // ---------------------------------------- // コンシューマを作成してメッセージを受信する。 // ---------------------------------------- // コンシューマのセッションが AUTO_ACKNOWLEDGE モードで作成されたため、 // メッセージはサーバから自動的に削除される。 // IMessageConsumer consumer = session.CreateConsumer(queue); IMessage recvMessage = consumer.Receive(500); PrintMessage("Received Message:", recvMessage); // ------------------------------------------------------------------ // 接続を閉じる。接続を閉じると、 // その子セッション、コンシューマ、およびプロデューサも閉じられる。 // ------------------------------------------------------------------ connection.Close(); } finally { // ------------------------------------------------------------------ // コンテキストを閉じる。CloseAll メソッドでは、 // ネットワーク接続と、関連する開いている接続、セッション、プロデューサ、コンシューマを // すべて閉じる。 // ------------------------------------------------------------------ context.CloseAll(); } } // MessageEventHandler 委託を実装する。非同期に // 配信されたメッセージを受信する。 public void OnMessage(IMessageConsumer consumer, MessageEventArgs args) { PrintMessage("Received Message Asynchronously:", args.Message); // ----------------------------------------------------------------- // コンシューマのセッションが CLIENT_ACKNOWLEDGE である場合は、 // args.Message.Acknowledge() を呼び出してメッセージの再配信を防止するか、 // consumer.Session.Recover() を呼び出して再配信を強制すること。 // 同様に、コンシューマのセッションが TRANSACTED である場合は、 // consumer.Session.Commit() を呼び出してメッセージの再配信を防止するか、 // consumer.Session.Rollback() を呼び出して再配信を強制すること。 } private void DemoAsyncNondurableTopicConsumerAutoAcknowledge() { Console.WriteLine( NL + "-- DemoAsyncNondurableTopicConsumerAutoAcknowledge -- " + NL); // ------------------------------------------------ // WebLogic へのネットワーク接続を確立してログインする。 // ------------------------------------------------ IDictionary<string, Object> paramMap = new Dictionary<string, Object>(); paramMap[Constants.Context.PROVIDER_URL] = "t3://" + this.host + ":" + this.port; IContext context = ContextFactory.CreateContext(paramMap); try { // ------------------------------------- // コンテキストでリソースをルックアップする。 // ------------------------------------- IConnectionFactory cf = context.LookupConnectionFactory(this.cfName); ITopic topic = (ITopic)context.LookupDestination(this.topicName); // -------------------------------------------------------------- // 接続ファクトリを使用して接続を作成して開始する。 // -------------------------------------------------------------- IConnection connection = cf.CreateConnection(); // ----------------------------------------------------------------- // 受信側がメッセージを取得できるように接続を開始する。 // ----------------------------------------------------------------- connection.Start(); // ------------------------------------------ // 非同期コンシューマの委託を作成する。 // ------------------------------------------ // セッションとコンシューマを作成する。 // 非同期に到着するメッセージをリスンする委託も指定する。 // IMessageConsumer consumer = session.CreateDurableSubscriber( topic, "MySubscriberID"); // ----------------------------------- // プロデューサを作成して永続メッセージを送信する。 // ------------------------------------------------ IMessageProducer producer = session.CreateProducer(topic); producer.DeliveryMode = Constants.DeliveryMode.PERSISTENT; ITextMessage sendMessage = session.CreateTextMessage("My durable message"); producer.Send(sendMessage); PrintMessage("Sent Message To Durable Subscriber:", sendMessage); // ---------------------------------------------------- // コンシューマのクローズと再作成を例示する。 // // 重要 : セッションはスレッドセーフではない。プロデューサと非同期コンシューマ // を同時に実行するために、複数のセッションを使用する。 // OnMessage をイベント ハンドラとして指定すると、 // イベント ハンドラに対するメッセージは別のスレッドに届く可能性があるため、 // コンシューマ セッションとそのプロデューサとコンシューマを OnMessage コールバック // の外側で使用できなくなる。 // ISession consumerSession = connection.CreateSession( Constants.SessionMode.AUTO_ACKNOWLEDGE); IMessageConsumer consumer = consumerSession.CreateConsumer(topic); consumer.Message += new MessageEventHandler(this.OnMessage); // ------------- // メッセージを送信する。 // ------------- // プロデューサを作成して非永続メッセージを送信する。非恒久コンシューマ // だけトピックをサブスクライブしているので、 // メッセージは永続として送信された場合でも、 // 自動的に非永続にダウングレードされる。 // ISession producerSession = connection.CreateSession( Constants.SessionMode.AUTO_ACKNOWLEDGE); IMessageProducer producer = producerSession.CreateProducer(topic); producer.DeliveryMode = Constants.DeliveryMode.NON_PERSISTENT; ITextMessage sendMessage = producerSession.CreateTextMessage( "My topic message"); producer.Send(sendMessage); PrintMessage("Sent Message:", sendMessage); // ----------------- // メッセージを待機する。 // ----------------- // 委託がメッセージを受信して自動的に確認応答できるように、 // 1 秒間スリープする。委託は // メッセージを受信するとコンソールに出力する。 // Thread.Sleep(1000); // --------- // クリーンアップ // --------- // connection.Close() を呼び出して // 接続のセッションなどが閉じられる。 // または、context.CloseAll() を呼び出す。 // ここでは個々のリソースを閉じる方法を示す。 // producer.Close(); consumer.Close(); producerSession.Close(); consumerSession.Close(); connection.Close(); } finally { // ------------------------------------------------------------- // コンテキストを閉じる。CloseAll メソッドでは、 // ネットワーク接続と、開いている JMS 接続、セッション、プロデューサ、コンシューマを // すべて閉じる。 // ------------------------------------------------------------- context.CloseAll(); } } private void DemoSyncTopicDurableSubscriberClientAcknowledge() { Console.WriteLine( NL + "-- DemoSyncTopicDurableSubscriberClientAcknowledge -- " + NL); // ------------------------------------------------ // WebLogic へのネットワーク接続を確立してログインする。 // ------------------------------------------------ IDictionary<string, Object> paramMap = new Dictionary<string, Object>(); paramMap[Constants.Context.PROVIDER_URL] = "t3://" + this.host + ":" + this.port; IContext context = ContextFactory.CreateContext(paramMap); try { // ------------------------------------- // コンテキストでリソースをルックアップする。 // ------------------------------------- IConnectionFactory cf = context.LookupConnectionFactory(this.cfName); ITopic topic = (ITopic)context.LookupDestination(this.topicName); // ------------------------------------------------- // 接続ファクトリを使用して接続を作成する。 // ------------------------------------------------- IConnection connection = cf.CreateConnection(); // -------------------------------------------- // ユニークなクライアント ID を接続に割り当てる。 // -------------------------------------------- // 恒久サブスクライバは割り当てられたクライアント ID を使って // 接続を使用する必要がある。クラスタ内に // 一度に存在できるのは、特定のクライアント ID を持つ 1 つの接続のみ。API を使用する代わりに、 // 接続ファクトリのコンフィグレーションから // クライアント ID をコンフィグレーションする方法もある。 connection.ClientID = "MyConnectionID"; // ----------------------------------------------------------------- // コンシューマがメッセージを取得できるように接続を開始する。 // ----------------------------------------------------------------- connection.Start(); // ----------------- // セッションを作成する。 // ----------------- // 重要 : セッションはスレッドセーフではない。プロデューサとコンシューマ // を同時に実行する必要がある場合は、複数のセッションを使用する。詳細については、 // 以下の非同期コンシューマ例を参照する。 // ISession session = connection.CreateSession( Constants.SessionMode.CLIENT_ACKNOWLEDGE); // ----------------------------------------------- // 恒久サブスクリプションとそのコンシューマを作成する。 // ----------------------------------------------- // 接続 ID「MyConnectionID」とサブスクリプション ID「MySubscriberID」で、 // 一度に 1 つのコンシューマのみが // 恒久サブスクリプションにアタッチできる。 // // キュー コンシューマとは異なり、メッセージを受信するには、 // メッセージが送信される「前に」トピック コンシューマを作成しておく必要がある。 // IMessageConsumer consumer = session.CreateDurableSubscriber( topic, "MySubscriberID"); // ------------------------------------------------ // プロデューサを作成して永続メッセージを送信する。 // ------------------------------------------------ IMessageProducer producer = session.CreateProducer(topic); producer.DeliveryMode = Constants.DeliveryMode.PERSISTENT; ITextMessage sendMessage = session.CreateTextMessage("My durable message"); producer.Send(sendMessage); PrintMessage("Sent Message To Durable Subscriber:", sendMessage); // ---------------------------------------------------- // Demonstrate closing and re-creating the consumer. // // 同じ接続 ID とサブスクリプション ID を指定するので、 // 新しいコンシューマは上記で作成された恒久サブスクリプション // に暗黙的に接続する。 // // 恒久サブスクリプションは存在し続け、 // コンシューマがない場合は新しいメッセージを蓄積するクライアント // またはサーバがクラッシュして再起動した場合は、 // 永続メッセージを保持する。 // // 非恒久サブスクリプションとそのメッセージは、閉じられた場合に、 // またはホスト サーバが停止やクラッシュした場合に、 // 存在しなくなる。 // ---------------------------------------------------- consumer.Close(); consumer = session.CreateDurableSubscriber( topic, "MySubscriberID"); // ------------------------------------------------------------------- // クライアントの確認応答を例示する。メッセージを取得し、 // 再配信を強制し、再びメッセージを取得して、最後にメッセージを削除する。 // ------------------------------------------------------------------- // クライアント ACK モードの場合、「acknowledge()」がメッセージを // 削除する一方で「recover()」がメッセージの再配信を強制する。クライアント アプリケーションは // メッセージを確認応答せずにクラッシュするか閉じられた場合、 // メッセージは再配信される。 ITextMessage recvMessage = (ITextMessage)consumer.Receive(500); PrintMessage("Durable Subscriber Received Message:", recvMessage); session.Recover(); recvMessage = (ITextMessage)consumer.Receive(500); PrintMessage("Durable Subscriber Received Message Again:", recvMessage); recvMessage.Acknowledge(); // ------------------------------------------------------------ // 恒久サブスクリプションを削除する。 // 削除しなければ、このデモが終了した後も存在し続ける。 // ------------------------------------------------------------ // consumer.Close(); // コンシューマを閉じるが、サブスクリプションを削除しません。 session.Unsubscribe("MySubscriberID"); // サブスクリプションを削除する。 // ------------------------------------------------------------------ // 接続を閉じる。接続を閉じると、 // その子セッション、コンシューマ、およびプロデューサも閉じられる。 // ------------------------------------------------------------------ connection.Close(); } finally { // ------------------------------------------------------------------ // コンテキストを閉じる。CloseAll メソッドでは、 // ネットワーク接続と、関連する開いている接続、セッション、プロデューサ、コンシューマを // すべて閉じる。 // ------------------------------------------------------------------ context.CloseAll(); } } private void PrintMessage(String header, IMessage msg) { string msgtext; if (msg is ITextMessage) msgtext = " Text=" + ((ITextMessage)msg).Text + NL; else msgtext = " The message is not an ITextMessage"; string dcProp = Constants.MessagePropertyNames.DELIVERY_COUNT_PROPERTY_NAME; System.Console.WriteLine( header + NL + " JMSMessageID=" + msg.JMSMessageID + NL + " JMSRedelivered=" + msg.JMSRedelivered + NL + " " + dcProp + "=" + msg.GetObjectProperty(dcProp) + NL + msgtext); } private bool ParseCommandLine(string[] args) { int i = 0; try { for(i = 0; i < args.Length; i++) { if (args[i].Equals("-host")) { host = args[++i]; continue; } if (args[i].Equals("-port")) { port = Convert.ToInt32(args[++i]); continue; } if (args[i].Equals("-cf")) { cfName = args[++i]; continue; } if (args[i].Equals("-queue")) { queueName = args[++i]; continue; } if (args[i].Equals("-topic")) { topicName = args[++i]; continue; } if (args[i].Equals("-help") || args[i].Equals("-?")) { Console.WriteLine(USAGE); return false; } Console.WriteLine("Unrecognized parameter '" + args[i] + "'."); Console.WriteLine(USAGE); return false; } } catch (System.IndexOutOfRangeException) { Console.WriteLine( "Missing argument for " + args[i - 1] + "." ); Console.WriteLine(USAGE); return false; } catch (FormatException) { Console.WriteLine( "Invalid argument '" + args[i] + "' for " + args[i - 1] + "." ); Console.WriteLine(USAGE); return false; } Console.WriteLine( "WebLogic JMS .NET Client Demo " + NL + NL + "Settings: " + NL + " host = " + host + NL + " port = " + port + NL + " cf = " + cfName + NL + " queue = " + queueName + NL + " topic = " + topicName + NL ); return true; } }