.NET アプリケーションでは、メッセージ・リスナーを使用してメッセージを非同期に受信し、例外リスナーを使用して接続の問題に関する通知を非同期に受信します。
.NET でのメッセージ・リスナーと例外リスナーの機能は、C++ の場合と同一です。ただし、実装による多少の差があります。
メッセージを非同期に受信するには、以下の操作を実行する必要があります。
public delegate void MessageListener(IMessage msg);
また、メソッドを以下のように定義できます。
void SomeMethodName(IMessage msg);
MessageListener OnMsgMethod = new MessageListener(SomeMethodName)
consumer.MessageListener = OnMsgMethod;
MessageListener をヌルに戻し、代行を除去します。
consumer.MessageListener = null;
例外リスナーは、メッセージ・リスナーとほぼ同様に機能しますが、代行定義が異なり、メッセージ・コンシューマーではなく接続に割り当てられています。これは C++ と同一です。
public delegate void ExceptionListener(Exception ex);
このため、定義されるメソッドは以下のようになります。
void SomeMethodName(Exception ex);
ExceptionListener OnExMethod = new ExceptionListener(SomeMethodName)
connection.ExceptionListener = OnExMethod ;
ExceptionListener を元の設定に戻し、代行を除去します。
null: connection.ExceptionListener = null;
例外またはメッセージへの参照が残っていない場合、削除処理はガーベッジ・コレクターにより自動的に実行されるので、例外またはメッセージを削除する必要はありません。
上記の例を使用するサンプル・コードは以下のようになります。
using System; using System.Threading; using IBM.XMS; public class Sample { public static void Main() { XMSFactoryFactory factoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_RTT); IConnectionFactory connectionFactory = factoryFactory.CreateConnectionFactory(); connectionFactory.SetStringProperty(XMSC.RTT_HOST_NAME, "localhost"); connectionFactory.SetStringProperty(XMSC.RTT_PORT, "1506"); // // Create the connection and register an exception listener // IConnection connection = connectionFactory.CreateConnection(); connection.ExceptionListener = new ExceptionListener(Sample.OnException); ISession session = connection.CreateSession(false, AcknowledgeMode.AutoAcknowledge); IDestination topic = session.CreateTopic("topic://xms/sample"); // // Create the consumer and register an async message listener // IMessageConsumer consumer = session.CreateConsumer(topic); consumer.MessageListener = new MessageListener(Sample.OnMessage); connection.Start(); while (true) { Console.WriteLine("Waiting for messages...."); Thread.Sleep(1000); } } static void OnMessage(IMessage msg) { Console.WriteLine(msg); } static void OnException(Exception ex) { Console.WriteLine(ex); } }