WebSphere Message Service Clients for C/C++ and .NET, Version 1.2 作業系統: Linux, Windows

在 C++ 中使用訊息和異常狀況接聽器

C++ 應用程式會使用訊息接聽器以非同步接收訊息, 以及使用異常狀況接聽器以非同步獲知有問題的連線。

相關概念
可在執行時期處理的錯誤狀況

在 C++ 中使用訊息接聽器

若要非同步接收訊息,C++ 應用程式必須定義一個以 MessageListener 抽象類別為基礎的訊息接聽器類別。訊息接聽器類別必須提供 onMessage() 方法的實作。之後,應用程式才能建立類別的實例以建立訊息接聽器, 並針對每一個訊息使用端呼叫 setMessageListener() 方法, 以便向一或多個訊息使用端登錄訊息接聽器。接著,當訊息使用端的訊息送達時, XMS 會呼叫 onMessage() 方法以遞送訊息。XMS 不會建立訊息接聽器副本, 因此,當 XMS 呼叫 onMessage() 方法時,應用程式必須確定訊息接聽器仍為可用的。

請注意,如果階段作業中有多個訊息使用端具有已登錄的訊息接聽器, 則一次只能執行一個 onMessage() 方法。如需此狀況的相關資訊,以及如果您應用程式需要同時遞送訊息時的做法, 請參閱非同步訊息遞送

若要停止非同步遞送訊息給訊息使用端, 應用程式可再次呼叫 setMessageListener() 方法, 此時會將訊息接聽器的空值指標(而非指標)當成參數傳遞。除非您以這種方式取消訊息接聽器的登錄, 訊息接聽器必須和訊息使用端共存。

新訊息接聽器可向訊息使用端登錄,而不需取消現有訊息接聽器的登錄。當登錄新訊息接聽器時, 如果現有訊息接聽器的 onMessage() 方法正在執行,則作用中的方法仍會正常完成, 而任何後續的訊息則藉由呼叫新訊息接聽器的 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++ 中使用異常狀況接聽器

異常狀況接聽器的使用原則和訊息接聽器相同。

C++ 應用程式必須定義一個以 ExceptionListener 抽象類別為基礎的異常狀況接聽器類別。異常狀況接聽器類別必須提供 onException() 方法的實作。之後,應用程式才能建立類別的實例以建立異常狀況接聽器, 並呼叫 setExceptionListener() 方法,以便登錄異常狀況接聽器與連線。接著,如果 XMS 偵測連線問題, XMS 會呼叫 onException() 方法,以傳遞異常狀況給應用程式。XMS 不會建立異常狀況接聽器副本, 因此,當 XMS 呼叫 onException() 方法時,應用程式必須確定異常狀況接聽器仍為可用的。

若要停止非同步報告連線問題, 應用程式可再次呼叫 setExceptionListener() 方法, 此時會將訊息接聽器的空值指標(而非指標)當成參數傳遞。除非您以這種方式取消異常狀況接聽器的登錄, 異常狀況接聽器必須和連線共存。

請注意,由於 XMS 在呼叫 onException() 方法時會傳遞異常狀況的指標, 因此應用程式有責使用 C++ delete 運算子來釋放異常狀況。


Concept topic

使用條款 | 評比此網頁

時間戳記前次更新: 25 Apr 2006
(C) Copyright IBM Corporation 2005. All Rights Reserved.
本資訊中心採用 Eclipse 技術。(http://www.eclipse.org)