C++ アプリケーションは、メッセージ・リスナーを使用してメッセージを非同期に受信し、例外リスナーを使用して接続の問題に関する通知を非同期に受信します。
メッセージを非同期に受信するには、C++ アプリケーションが抽象クラス MessageListener に基づくメッセージ・リスナー・クラスを定義する必要があります。 メッセージ・リスナー・クラスは、onMessage() メソッドの実装を 提供する必要があります。アプリケーションはこのクラスをインスタンス化してメッセージ・リスナーを作成し、 1 つ以上のメッセージ・コンシューマーにこのメッセージ・リスナーを登録するため 各メッセージ・コンシューマーの setMessageListener() メソッドを呼び出します。その後、メッセージ・コンシューマーのメッセージが着信すると、XMS は onMessage() メソッドを呼び出してこのメッセージを配信します。XMS ではメッセージ・リスナーのコピーは作成されません。このため、XMS が onMessage() メソッドを呼び出す時点でメッセージ・リスナーが使用可能であることをアプリケーションが確認する必要があります。
セッションの複数のメッセージ・コンシューマーに対して 1 つのメッセージ・リスナーが登録されている場合、一度に 1 つの onMessage() メソッドのみを実行できます。この状況の詳細と、アプリケーションがメッセージの同時配信を必要とする場合の対処については、非同期メッセージ配信を参照してください。
メッセージ・コンシューマーへのメッセージの非同期配信を停止するには、アプリケーションが setMessageListener() メソッドを再度呼び出し、メッセージ・リスナーへのポインターではなく NULL ポインターをパラメーターとして渡します。 メッセージ・リスナーの登録がこの方法で取り消されている場合を除き、メッセージ・コンシューマーが存在している間はメッセージ・リスナーが存在している必要があります。
既存のメッセージ・リスナーの登録を取り消さずに、新規メッセージ・リスナーをメッセージ・コンシューマーに登録できます。既存のメッセージ・リスナーの onMessage() メソッドを実行中に新規メッセージ・リスナーを登録すると、 アクティブなメソッドが正常に完了し、後続のメッセージはすべて、新規メッセージ・リスナーの onMessage() メソッドの呼び出しにより処理されます。 トランザクションの進行中にメッセージ・リスナーが変更されると、新規メッセージ・リスナーの onMessage() メソッドの呼び出しによりトランザクションが完了します。
#include <xms.hpp> using namespace std; class MyMsgListener : public xms::MessageListener { public: virtual xmsVOID onMessage(const xms::Message * pMsg); }; -------–-------------------------------------------- xmsVOID MyMsgListener::onMessage(const xms::Message * pMsg) { if (pMsg != NULL) { cout << pMsg->getJMSCorrelationID() << endl; cout << pMsg->getJMSMessageID() << endl; if (pMsg->getType() == XMS_MESSAGE_TYPE_BYTES) { xms::BytesMessage * pBytes = (xms::BytesMessage *) pMsg; cout << pBytes->readUTF() << endl; } delete pMsg; } }XMS は onMessage() メソッドの呼び出し時にメッセージを指すポインターを渡すため、アプリケーションが delete 演算子を使用してメッセージを解放する必要がある点に注意 してください。
#include <xms.hpp> using namespace std; int main(int argc, char *argv[]) { int nRC = 0; xms::ConnectionFactory cf; xms::Connection conn; xms::Session sess; xms::Destination dest; xms::MessageConsumer msgConn; MyMsgListener msgLst; try { cf.setIntProperty(XMSC_CONNECTION_TYPE, XMSC_CT_RTT); cf.setIntProperty(XMSC_RTT_CONNECTION_PROTOCOL, XMSC_RTT_CP_TCP); cf.setStringProperty(XMSC_RTT_HOST_NAME, "localhost"); cf.setIntProperty(XMSC_RTT_PORT, 1506); conn = cf.createConnection(); sess = conn.createSession(); dest = xms::Destination(XMS_DESTINATION_TYPE_TOPIC, "test"); msgConn = sess.createConsumer(dest); msgConn.setMessageListener(&msgLst); conn.start(); while(xmsTRUE) { Sleep(1000); cout << "Waiting..." << endl; } } catch(exception & ex) { nRC = -1; } return(nRC); }
例外リスナーの使用法は、基本的にメッセージ・リスナーの使用法と似ています。
C++ アプリケーションは、抽象クラス ExceptionListener に基づく例外リスナー・クラスを定義する必要があります。例外リスナー・クラスは、onException() メソッドの実装を 提供する必要があります。アプリケーションはこのクラスをインスタンス化して例外リスナーを作成し、 setExceptionListener() メソッドを呼び出して例外リスナーを接続に登録します。その後、XMS が接続の問題を 検出すると、XMS は onException() メソッドを呼び出してアプリケーションに例外を渡します。XMS では例外リスナーのコピーは作成されません。このため、XMS が onException() メソッドを呼び出した時点で例外リスナーが使用可能であることをアプリケーションが確認する必要があります。
接続の問題の非同期レポートを停止するには、アプリケーションが setExceptionListener() メソッドを再度呼び出し、例外リスナーを指すポインターではなく NULL ポインターを パラメーターとして渡します。 例外リスナーの登録がこの方法で取り消されている場合を除き、接続が存在している間は例外リスナーが存在している必要があります。
XMS は onException() メソッドの呼び出し時に例外を指すポインターを渡すため、アプリケーションが C++ delete 演算子を使用して例外を解放する必要がある点に注意 してください。