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;
  }
}
onMessage() 메소드를 호출할 때 XMS 포인터를 메시지에 전달하므로 응용프로그램은 삭제 연산자를 사용하여 메시지를 릴리스해야 합니다.
다음 코드 단편에서는 응용프로그램이 이 메시지 리스너 클래스를 사용하여 메시지 처리자로의 메시지 비동기 전달을 구현하는 방법을 보여줍니다.
#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() 메소드를 다시 호출할 수 있습니다. 이 때 포인터를 예외 리스너에 전달하는 대신, 널 포인터를 매개변수로 전달합니다. 예외 리스너의 등록이 이러한 방법으로 취소되지 않는 경우 연결이 있으면 예외 리스너도 있어야 합니다.

onException() 메소드를 호출할 때 XMS 포인터를 예외에 전달하므로 응용프로그램은 C++ 삭제 연산자를 사용하여 예외를 릴리스해야 합니다.


Concept topic

이용약관 | 피드백

Timestamp icon마지막 갱신 날짜: 3 Mar 2006
(C) Copyright IBM Corporation 2005. All Rights Reserved.
이 Information Center는 Eclipse 기술 기반입니다. (http://www.eclipse.org 웹 사이트 참조)