C++ 응용프로그램은 메시지 리스너를 사용하여 메시지를 비동기로 수신하고 예외 리스너를 사용하여 연결 문제점을 비동기로 알립니다.
메시지를 비동기로 수신하려면 C++ 응용프로그램은 요약 클래스 MessageListener에 따라 메시지 리스너 클래스를 정의해야 합니다. 메시지 리스너 클래스는 onMessage() 메소드의 구현을 제공해야 합니다. 응용프로그램은 클래스를 인스턴스화하여 메시지 리스너를 작성할 수 있으며 각 메시지 처리자에 대해 setMessageListener() 메소드를 호출하여 메시지 리스너를 하나 이상의 메시지 처리자에 등록할 수 있습니다. 그런 다음, 메시지 처리자에 메시지가 도착하면 XMS onMessage() 메소드를 호출하여 메시지를 전달합니다. XMS 메시지 리스너를 복사하지 않으므로 응용프로그램은 XMS onMessage() 메소드를 호출할 때 메시지 리스너를 사용할 수 있는지 확인해야 합니다.
세션에서 둘 이상의 메시지 처리자에 메시지 리스너가 등록되어 있으면 한 번에 하나의 onMessage() 메소드만 실행할 수 있습니다. 이러한 경우와 응용프로그램에서 메시지를 동시에 전달할 경우에 수행할 작업에 대한 자세한 정보는 비동기 메시지 전달을 참조하십시오.
메시지 처리자로 메시지의 비동기 전달을 중지할 경우 응용프로그램은 setMessageListener() 메소드를 다시 호출할 수 있습니다. 이 때 포인터를 메시지 리스너에 전달하는 대신, 널 포인터를 매개변수로 전달합니다. 메시지 리스너의 등록이 이러한 방법으로 취소되지 않는 경우 메시지 처리자가 있으면 메시지 리스너도 있어야 합니다.
기존 메시지 리스너의 등록을 취소하지 않고 새 메시지 리스너를 메시지 처리자에 등록할 수 있습니다. 새 메시지 리스너가 등록될 때 기존 메시지 리스너의 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++ 응용프로그램은 요약 클래스 ExceptionListener에 따라 예외 리스너 클래스를 정의해야 합니다. 예외 리스너 클래스는 onException() 메소드의 구현을 제공해야 합니다. 응용프로그램은 클래스를 인스턴스화하여 예외 리스너를 작성할 수 있으며 setExceptionListener() 메소드를 호출하여 예외 리스너를 연결에 등록할 수 있습니다. 그런 다음, XMS 연결 문제점을 발견하면 XMS onException() 메소드를 호출하여 예외를 응용프로그램에 전달합니다. XMS는 예외 리스너를 복사하지 않으므로 응용프로그램은 XMS onException() 메소드를 호출할 때 예외 리스너를 사용할 수 있는지 확인해야 합니다.
연결 문제점의 비동기 보고를 중지할 경우 응용프로그램은 setExceptionListener() 메소드를 다시 호출할 수 있습니다. 이 때 포인터를 예외 리스너에 전달하는 대신, 널 포인터를 매개변수로 전달합니다. 예외 리스너의 등록이 이러한 방법으로 취소되지 않는 경우 연결이 있으면 예외 리스너도 있어야 합니다.
onException() 메소드를 호출할 때 XMS 포인터를 예외에 전달하므로 응용프로그램은 C++ 삭제 연산자를 사용하여 예외를 릴리스해야 합니다.