2011-10-10 2 views
1

SetBytesProperty/GetBytesProperty 메소드 쌍이 MQMessage 클래스에 있습니다. (WebSphere MQ Client 7.0.1.6을 사용하고 있습니다). 성공적으로 대기열에 속성에 sbyte 배열을 보낼 수 있지만 일단 내가 항상 null 얻을 읽기 메시지를 다시하려고하면.WebSphere MQ에서 SetBytesProperty 및 GetBytesProperty를 사용하는 방법은 무엇입니까?

다음은 문제를 재현하는 데 사용하는 가장 간단한 코드입니다.

[TestFixture] 
public class MQQueueTests { 

    public const string MessageContent = "<test>This is test message</test>"; 

    [Test] 
    public void PutAndGetMessage() { 
     Environment.SetEnvironmentVariable("MQCCSID", "437"); 
     var properties = new Hashtable 
          { 
           {MQC.HOST_NAME_PROPERTY, "TestServer"}, 
           {MQC.CHANNEL_PROPERTY, "Test.Channel"}, 
           {MQC.PORT_PROPERTY, 1415} 
          }; 

     using (var manager = new MQQueueManager("Test.Queue.Manager", properties)) { 
      using (MQQueue queue = manager.AccessQueue("Test.Queue", 
       MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF)) { 

       MQMessage message = new MQMessage(); 
       message.SetBytesProperty("testBytesValue", 
        new sbyte[] { 8, 12, 22, 48, 68, 71, 92, 104 }); 
       message.WriteUTF(MessageContent); 
       queue.Put(message); 

       MQMessage readMessage = new MQMessage(); 
       queue.Get(readMessage); 

       sbyte[] array = readMessage.GetBytesProperty("testBytesValue"); 
       Assert.IsNotNull(array); // <-- FAILS! 

       Assert.AreEqual(MessageContent, readMessage.ReadUTF()); 

       queue.Close(); 
      } 
      manager.Disconnect(); 
     } 
    } 
} 

뭔가가 큐에 메시지 속성에 전달 - 나는 서버에 WebSphere MQ 탐색기에서 뭔가를 볼 수 있지만 내 통과 배열처럼 보이지 않는 (그것도 시간이 지남에 따라 변경 새 메시지가 수신 될 때) : 큐에 메시지를 넣는 경우

이 로그에 존재 :

enter image description here

내가 MQ 클라이언트에 (strmqtrc)을 추적 켜면 나는 같은 값 쓴 클라이언트에 의해 읽어 볼 수 있습니다 :

Data:- 
0x00000000 026B5878 3C 75 73 72 3E 3C 74 65 73 74 42 79 74 65 73 56 : <usr><testBytesV 
0x00000000 026B5888 61 6C 75 65 20 64 74 3D 22 62 69 6E 2E 68 65 78 : alue dt="bin.hex 
0x00000000 026B5898 22 20 3E 30 38 30 63 31 36 33 30 34 34 34 37 35 : " >080c163044475 
0x00000000 026B58A8 63 36 38 3C 2F 74 65 73 74 42 79 74 65 73 56 61 : c68</testBytesVa 
0x00000000 026B58B8 6C 75 65 3E 3C 2F 75 73 72 3E 20 20    : lue></usr> 

큐에서 메시지를 받고 (내가 짧게하기 위해 일부 데이터를 제거하지만, 중요한 부분은 정확히 로그에서 같다) 할 때 로그에 존재 :

Receiving Data:- 

0x00000000 1D2A5090 20 20 20 20 20 20 20 20 00 00 00 00 B8 04 00 00 :   ....¸... 
0x00000000 1D2A50A0 4C 00 00 00 3C 75 73 72 3E 3C 74 65 73 74 42 79 : L...<usr><testBy 
0x00000000 1D2A50B0 74 65 73 56 61 6C 75 65 20 64 74 3D 22 62 69 6E : tesValue dt="bin 
0x00000000 1D2A50C0 2E 68 65 78 22 20 3E 30 38 30 63 31 36 33 30 34 : .hex" >080c16304 
0x00000000 1D2A50D0 34 34 37 35 63 36 38 3C 2F 74 65 73 74 42 79 74 : 4475c68</testByt 
0x00000000 1D2A50E0 65 73 56 61 6C 75 65 3E 3C 2F 75 73 72 3E 20 20 : esValue></usr> 
0x00000000 1D2A50F0 00 21 3C 74 65 73 74 3E 54 68 69 73 20 69 73 20 : .!<test>This is 
0x00000000 1D2A5100 74 65 73 74 20 6D 65 73 73 61 67 65 3C 2F 74 65 : test message</te 
0x00000000 1D2A5110 73 74 3E 34 54 53 48 4D 00 00 00 34 00 00 00 01 : st>4TSHM...4.... 
모두 보내는 그래서

및 수신 올바른 바이트 배열을 참조하십시오. 그러나 .NET 코드에서 속성 값은 null입니다 :

enter image description here

다른 모든 GetXXXPropertySetXXXProperty 방법 쌍은 아무 문제없이 작동합니다.

편집 : 나는 그것을에서는 WebSphere MQ 클라이언트의 동일한 버전을 실행하는 여러 대의 컴퓨터에서 작동하지 않습니다와 나는 또한 다른 코드가 작동하지 않는다는 것을 확인하는 것이 확인

. 테스트를 Java로 다시 작성하고 대신 Java API를 사용하면 작동합니다!

또한 MQTopic에 타겟팅 된 메시지의 속성을 전송하는 데 문제가 있습니다. MQException : MRQC_HEADER_ERROR이 있습니다. 다시 문제없이 Java에서 작동합니다.

답변

1

값을 얻을 수 있습니다. 반환 된 배열은 보낸 메시지의 값과 동일한 값을가집니다. 여기에 사용 된 C# 코드 조각이 있습니다.

   MQMessage message = new MQMessage(); 
       message.SetBytesProperty("testBytesValue", new sbyte[] { 8, 12, 22, 48, 68, 71, 92, 104 }); 
       message.WriteUTF(MessageContent); 
       queue.Put(message); 

       MQMessage readMessage = new MQMessage(); 
       queue.Get(readMessage); 

       sbyte[] array = readMessage.GetBytesProperty("testBytesValue"); 
       Console.Write(array); 
+0

어떤 버전의 클라이언트와 'amqmdnet' 라이브러리를 사용하고 있는지 확인할 수 있습니까? 나는 두 컴퓨터에서 여러 번 코드를 시도했다. 클라이언트에 설치된'MQMessagePropertiesSample'도 사용했다. (기본적으로 바이트 배열을 포함하지 않았다. 절대로 작동하지 않지만 JUnit으로 Java로 테스트를 작성하면 작동합니다! –

+0

그건 내가 언젠가 다시 쓴 프로그램 이었지만 내가 시도한 클라이언트의 버전을 기억하지 못했습니다. 하지만 오늘은 MQ v7016을 확인한 결과 동일한 오류가 발생했습니다. 반환 된 배열은 null입니다. IBM 지원을 요청할만한 가치가 있습니다. – Shashi

관련 문제