2014-10-21 8 views
0

Websphere MQ 대기열로 메시지를 보내고 있습니다. 메시지를 보내는 동안 REPLY TO QUEUE NAME과 JMSCOrrelationID를 설정합니다. 우리는 또한 사용자 IDENTIFIER를 설정합니다. 코드 스 니펫은 다음과 같습니다.수신 된 COD에 correlID와 본문이 null로 있습니다.

Message msg = session.createTextMessage((String) message); 
Destination codeDestination = session.createQueue("queue://" + replyToQueueMgr + "/" + replyToQueueName); 
msg.setJMSReplyTo(codeDestination); 
msg.setIntProperty(JmsConstants.JMS_IBM_REPORT_COD, MQC.MQRO_COD); 
msg.setJMSCorrelationID(msgCorrelId); 
msg.setStringProperty(JmsConstants.JMS_IBM_MQMD_USERIDENTIFIER, "abc"); 
producer.send(msg); 

우리가 설정 한 모든 필드가 null이 아니란 점을 유의하십시오. 또한 abc 사용자는 유효한 사용자입니다. 그렇지 않으면 COD가 DEAD LETTER QUEUE로 이동해야하지만 거기에 메시지가 없기 때문입니다. 메시지가 수집 된 후에도 JMSCorrelationID가 null 인 COD가 발생합니다. COD 프로세서에서는 replyToQueuename을 수신 대기합니다.

String correlationID = (String)eventContext.getMessage().getInboundProperty("JMSCorrelationID"); 

위에 체크하면 상관 ID가 null입니다. 또한 메시지 페이로드는 {null_payload} 유형의 NullPayload 클래스 노새입니다. 나는 우리가 MQC.MQRO_COD을 설정 했으므로 본문이 NULL이라는 것을 알고 있습니다. 하지만 상관 관계가 어떻게 사라 졌는지는 모르겠다.

Webview MQ에서 이러한 동작이 발생할 수있는 구성이 있는지 알려주십시오. 또는 헤더 속성을 설정하는 방식에 뭔가 빠졌습니까?

UPDATE는

우리는 COD 정보에 메시지를 보내는 큐는 주제에 대한 별칭입니다. 이 TOPIC에 2 명의 가입자가 있으며 두 가입자가 메시지를 받았을 때 여러 개의 COD를받은 사례가 있음을 확인했습니다. 모든 가입자가 메시지를 가져온 후 TOPIC에서 단일 COD를 전송할 수있는 방법이 있습니까? 이 QM 설정이 null로 COD의 원인이 될 수 있습니까?

+0

MQRO_COD_WITH_FULL_DATA ... getInboundProperty()가 표준 JMS MQ 호출이 아닐 수도 있습니다. getMessage()에서 리턴 된 메시지 오브젝트 클래스는 무엇입니까? – Calanais

+0

전체 데이터가 삭제 될 수 있습니다. MQRO_COD_WITH_DATA (메시지 데이터의 100 바이트 만 포함)를 시도 할 수 있습니다. – Roger

+0

getInboundProperty()는 뮬 API 메서드입니다. 그리고 나는 어떤 자료도 원하지 않는다. 유사한 구성이 다른 QM에서 보낸 다른 메시지에도 적용됩니다. –

답변

2

사용자 식별자 메시지가 게시

, 각 가입자는 고유 메시지 ID로와 MQMD의 ID 컨텍스트 필드 (사용자 ID가 AccountingToken, ApplIdentityData가) 모든 설정과 메시지의 사본을 얻는다 가입자의 컨텍스트 따라서 게시하는 메시지의 MQMD UserID에서 설정 한 내용과 상관없이 모든 사본에 구독자 사용자 ID가 포함됩니다. 이 사용자 ID는 정의에 따라 가입자가있는 위치에 있으므로 COD를 넣을 수 있습니다. 당신은 게시자의 상관 ID를 보장 할 수

하위 펍과

상관 관계 ID는/MQCI_NONE하는 MQSO SubCorrelId을 MQSO_SET_CORREL_ID를 사용하여 설정되어 구독을 보장함으로써, 가입자에 이르기까지 모든 방법을 전송 . 여러 메시지

여러 개의 독립적 인 메시지가 있기 때문에의 COD 보고서 옵션 세트를 각각

한 COD, 여러 보고서 메시지를 받게됩니다. 이 두 가지를 결합 할 수있는 설정은 없지만 기본 응용 프로그램에서 하나만을 원하면 중간 응용 프로그램을 작성하여 결합 할 수 있습니다.

기본적으로 다시보고 메시지

에서 CORREL ID를 전달 보고서 메시지의 CORREL ID의 메시지 ID를 다시 보내드립니다 보고서 옵션을 선택합니다. 상관 ID가 다시 전달되도록하려면 MQRO_PASS_CORREL_ID를 사용해야합니다.

또한 독서

0

문제는 MQ 구성으로하지만 뮬 엔드 포인트 구성하지 않습니다. nullpayload로 전송 된 COD는 실제로 내 자신의 뮬 애플리케이션 jmsRepyToHandler에 의해 전송되었습니다. 이 동작을 일으키는 것으로 보이는 Mule에는 몇 가지 기본 구성이 있습니다.

분석

  • 응용 프로그램이 예상대로 우리가 2 COD를 얻을 일단 가입자 모두가 메시지를 소비하는 두 개의 가입자
  • 와 주제에 별칭 대기열에 메시지를 보냅니다.
  • 이러한 COD는 내 MULE 응용 프로그램에서 사용되며 처리 후 MULE 응용 프로그램은 COD를 null 상관 관계 ID가있는 동일한 대기열로 다시 보냅니다.

UPDATE : 뮬은 기본적으로 당신이

if (disableReplyTo) { 
    return new DisableJmsReplyToHandler(this, getDefaultResponseTransformers(endpoint)); 
}else { 
    return super.getReplyToHandler(endpoint); 
}  

그렇게 진실한 속성 disableReplyTo 설정은 다음과 같이 뮬 JMSConnector의 getReplyToHandler 메소드를 오버라이드 (override) 할 필요가 수정을 위해

을 ReplyTo의 피하기 위해 수정 위의 코드는 기본 값 대신 DisableJmsReplyToHandler를 제공합니다.