2017-04-21 2 views
1

샌드 박스 환경에서 IBM MQ를 테스트하고 있습니다. 이미 RabbitMq에 대한 경험이 있습니다.IBM MQ v8 - 게시 된 메시지의 실시간 소비

IBM MQ에서는 대기열에서 메시지를 직접 소비 할 수있는 가능성이 없습니다. RabbitMQ (Consume() 메소드)의 경우입니다. 그러나 IBM MQ와 나는 명시 적으로 다음 코드를 사용하여 큐에서 볼 필요가 :

var queue = _queueManager.AccessQueue("queueName", MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING); 

이것은 내가 지금 큐에서 메시지를 읽고에 대해 알고있는 것입니다. 그러나 위의 코드를 호출하지 않고 메시지를 직접 소비하는 방법 (이벤트 현명하거나 실시간 소비, 대기열의 항목이 메시지를 읽는 방아쇠가 될 경우)을 도와 줄 수있는 사람이 있습니까? ?

답변

2

XMS .NET 클라이언트의 메시지 수신기를 사용하여 큐에 도착할 때 메시지를 소비 할 수 있습니다. 프로젝트에서 IBM.XMS 어셈블리를 참조해야합니다. 당신은 비동기 소비자 샘플 Tools\dotnet\samples\cs\xms\simple\wmq\SimpleAsyncConsumer\SimpleAsyncConsumer.cs.

+0

고맙습니다. 자세한 정보 : https://www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xms_cuselisnr_net.htm – Ozkan

1

메시지 대기열에 의해 트리거되도록하려면 PROCESS를 구성하고 대기열에 대한 트리거 메시지를 기반으로 실행되도록 프로세스를 설정할 수 있습니다.

또는 MQGMO_WAIT를 조사 할 수 있으며 위와 거의 동일한 코드를 사용하여 대기열에서 메시지를 수신하는 동안 스레드를 차단할 수 있습니다.

EDIT : 메시지가 트리거 대기열에 도착할 때마다 (처음마다) 또는 메시지가 처음 트리거 큐에 도착할 때마다 (즉, MQ 프로세스가 무언가가 될 수 있도록) 코드를 설정할 수 있습니다 "/path/to/myprog.exe"와 같습니다. 전달 된 매개 변수는 MQTriggerMessage 형식으로되어 있으며 큐 이름과 기타 몇 가지 세부 사항을 포함합니다. 이렇게하면 모든 메시지에 대해 트리거를 설정한다고 가정 할 때 여러 가지 처리 작업을 수행 할 수 있습니다.

또는 큐를 공유로 열면 여러 작업이 메시지가 대기열에 도착할 때까지 대기 할 수 있습니다. MQOpenOption.INPUT_SHARED 플래그 사용.

+0

프로세스에서 어떤 의미입니까? 문제는 내가 작업하고있는 프로젝트에서 IBMMQ 서버가 다른 곳에 있으며 구성 할 수 없다는 것입니다. MQ 서버의 연결 정보와 자격 증명 만 있습니다. 위의 가능성 중 어느 것을 선택 하시겠습니까? – Ozkan

+0

나는 당신이 찾고있는 것에 대해 다소 불명확하다. 그러나 당신이 더 많은 세부 사항을 준다면 나는 더 나은 대답을하려고 노력할 수있다. –

1

볼 수 있습니다 그러나 IBM MQ와 나는 명시 적으로 코드를 다음과 같이 큐에서 볼 필요가 :

VAR 큐 = _queueManager.AccessQueue를 ("QUEUENAME", ... AccessQueue는 큐를 열기 때문

당신은 좀 더 읽기를 할 필요가있다. 당신은 메시지를 검색 할 큐의 Get 메서드를 사용해야합니다.

당신이 완 경우 큐 관리자가 종료 될 때까지 영원히하지 않으려면 다음을 수행하십시오.

private void loopForever(MQQueue inQ) 
{ 
    bool flag = true; 
    MQMessage msg = new MQMessage(); 
    MQGetMessageOptions gmo = new MQGetMessageOptions(); 
    gmo.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING; 
    gmo.WaitInterval = MQC.MQEI_UNLIMITED; 

    while (flag) 
    { 
     try 
     { 
     msg = new MQMessage(); 
     inQ.Get(msg, gmo); 
     System.Console.Out.WriteLine("Message Data: " + msg.ReadString(msg.MessageLength)); 
     } 
     catch (MQException mqex) 
     { 
     System.Console.Out.WriteLine("MQTest61B CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode); 
     flag = false; // severe error - time to exit 
     } 
     catch (System.IO.IOException ioex) 
     { 
      System.Console.Out.WriteLine("MQTest61B ioex=" + ioex); 
     } 
    } 
}