.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"); // // 建立連線並登錄異常狀況接聽器 // IConnection connection = connectionFactory.CreateConnection(); connection.ExceptionListener = new ExceptionListener(Sample.OnException); ISession session = connection.CreateSession(false, AcknowledgeMode.AutoAcknowledge); IDestination topic = session.CreateTopic("topic://xms/sample"); // // 建立消費者並登錄非同步訊息接聽器 // 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); } }