2011-03-11 2 views
1

주어진 주제에서 하나의 메시지를 검색하지만 그 중 하나를 검색하려고하면 주제에 관한 메시지가 있어도 실패합니다. 코드는 destForGet.Get(messageForGet);이 while 루프에 있고 옵션에서 설정을 기다리는 시간을 제외하고는 IBM이 제공 한 샘플 코드와 동일합니다. 다른 클라이언트가 메시지를 주제에 넣으면 작동합니다. 첫 번째 메시지는 수신되지만 다른 메시지는 수신되지 않습니다. WebSphere7 MQTopic 다중 메시지 검색

// bool RunThread is managed from some other thread; irrelevant for this snippet 
// MQTopic destForGet is initialized earlier; irrelevant for this snippet 
MQMessage messageForGet = new MQMessage(); 
MQGetMessageOptions mgo = new MQGetMessageOptions(); 
mgo.Options = MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_SYNCPOINT; 
mgo.WaitInterval = 500; 
string subName = "SampleSubscription"; 

while (RunThread) 
{ 
    try 
    { 
     DestForGet.Get(messageForGet, mgo); 
    } 
    catch (MQException mqE) 
    { 
     Console.WriteLine("MQException caught. " + mqE.ToString()); 
    } 
} 

나는, while 루프 내에서 messageForGet를 인스턴스화하는 경우

다음 작동,하지만 (일정/할당 해제 메모리를 할당) 매우 비효율적 인 것 같다 : 샘플 코드는 이하 주어진다. 또한 messageForGet.ClearMessage()은 문제가되지 않습니다. 각 개별 메시지를 인스턴스화하지 않고 주제에서 여러 메시지를 검색 할 수있는 방법이 있습니까?

답변

0

아마도 첫 번째 메시지는 메시지 설명자 필드와 메시지 ID 중 하나를 설정합니다. 같은 메시지 개체를 사용하는 후속 GET에서 MsgID가 있으면 WMQ가이를 선택 기준으로 사용합니다. 이 방법은 매개 변수로 MQMessage 객체 소요

: 그

manual page on the MQQueue.Get method 상태. 객체의 필드 중 일부는 입력 매개 변수, 특히 messageId 및 correlationId로 사용되므로 이 필수 항목으로 설정되어 있는지 확인하는 것이 중요하므로 이 중요합니다.

MQMessage.ClearMessage()에 원하는 효과가없는 이유는 설명자가 아닌 메시지 페이로드에서 작동한다는 것입니다. the manual page for MQMessage.ClearMessage()에 따르면, 상기 방법

버리고 어떤 메시지 버퍼 내의 데이터와 데이터 세트 위로 제로에 오프셋.

두 개의 메시지를 인스턴스화하는 것이 좋습니다. 제로 길이의 페이로드 및 공백 메시지 설명자를 남겨 둡니다. 그런 다음 각 GET 전에 작업 메시지 객체에 빈 메시지를 복사합니다. 메시지 ID, 상관 ID 등과 같은 선택자로 QMgr에서 사용할 수있는 속성을 지우거나 지 웁니다.

1

"주제에 관한 메시지가 있더라도"무엇을 의미합니까? 주제에 깊이가 없습니다. 가장 가까운 MQ가 주제에 관한 메시지를 갖는 것은 유지 된 출판의 개념입니다. 여기서 마지막 게시 된 메시지가 유지되어 새 구독자가 검색 할 수 있습니다. 10 개의 메시지를 게시 한 다음 구독하면 해당 동작이 설명하는 내용과 일치합니다. 하나의 메시지 만 수신됩니다.

관련 문제