Как использовать SetBytesProperty и GetBytesProperty в WebSphere MQ? - PullRequest
1 голос
/ 10 октября 2011

У меня проблема с парой методов SetBytesProperty / GetBytesProperty в классе MQMessage (я использую WebSphere MQ Client 7.0.1.6). Я могу успешно отправить массив sbyte в свойстве в очередь, но как только я пытаюсь вернуть его обратно в сообщении чтения, я всегда получаю null.

Вот самый простой код, который я использую для воспроизведения проблемы.

[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 Explorer на сервере, но это не похоже на мой переданный массив (даже меняется со временем при получении новых сообщений):

enter image description here

Когда я включаю трассировку (strmqtrc) в MQ Client, я вижу то же значение, записанное и прочитанное клиентом:

Это присутствует в журнале при помещении сообщения в очередь:

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

Каждая другая пара методов GetXXXProperty и SetXXXProperty работает без проблем.

Edit:

Я подтвердил, что он не работает на нескольких компьютерах, работающих под управлением одной и той же версии клиентов WebSphere MQ, и также подтвердил, что он не работает с другим кодом. Это работает, если я переписываю тест на Java и использую Java API вместо этого!

У меня также есть проблемы с отправкой любого свойства в сообщении с адресом MQTopic - я получаю MQException : MRQC_HEADER_ERROR. Опять же, это работает на Java без проблем.

1 Ответ

1 голос
/ 11 октября 2011

Я могу получить значение.Я вижу, что возвращенный массив имеет те же значения, что и в отправленном сообщении.Вот фрагмент кода 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);
...