2015-07-24 3 views
0

У меня есть программное обеспечение, где я отбрасываю MQMessages через программное обеспечение C#. Во-первых: я получаю сообщение от MQ как строку XML-сообщения, я делаю некоторую обработку данных, а затем я готовлю XML-файл и отбрасываю его в очередь ответа. я установить корреляции Id сообщения запроса как такие же, как ответное сообщение, а также MessageId так:Ввод сообщения MQ в очередь

MQMessage _msg = new MQMessage(); 
_msg.Encoding = 273; 
_msg.CharacterSet = 37; 
_msg.Format = "MQSTR"; 
_msg.CorrelationId = message.CorrelationId; 
_msg.MessageId = message.MessageId; 

, где сообщение сообщение я получить (Запрос сообщения) и _msg является ответным сообщением, что я put (ответное сообщение)

На стороне IBM, когда я получаю ответное сообщение, я проверяю идентификатор корреляции с корреляционным идентификатором сообщения запроса, и он терпит неудачу.

Вот как я положил сообщение в очереди:

qmgr.AccessQueue(message.ReplyToQueueName.Trim(), MQC.MQOO_OUTPUT 
+ MQC.MQOO_FAIL_IF_QUIESCING, QueueManagerName, DynamicQueueName, "").Put(_msg); 

Чего не хватает в моем коде?

ответ

0

В чем мир, что вы делаете?

я установить корреляции Id сообщения запроса, как же, как и сообщения отклика, а также MessageId так:

Bad, очень плохой дизайн и идет вразрез с рисунком сообщений MQ.

(1) Не устанавливайте CCSID и кодировку, вы должны использовать значения по умолчанию и позволить MQ выполнять работу.

(2) Правильный шаблон обмена сообщениями заключается в том, чтобы установить CorrelationId сообщения ответа с сообщением MessageId сообщения запроса. Вот как вы связываете вещи вместе.

Ваш код должен выглядеть следующим образом:

MQMessage outMsg = new MQMessage(); 
outMsg.Encoding = MQC.MQENC_NATIVE; 
outMsg.CharacterSet = MQC.MQCCSI_DEFAULT; 
outMsg.Format = MQC.MQFMT_STRING; 
outMsg.MessageId = MQC.MQMI_NONE; 
outMsg.CorrelationId = inMsg.MessageId; 

Что в мире это?

qmgr.AccessQueue(message.ReplyToQueueName.Trim(), MQC.MQOO_OUTPUT 
+ MQC.MQOO_FAIL_IF_QUIESCING, QueueManagerName, DynamicQueueName, "").Put(_msg); 

OMG. Позвольте мне посчитать, как вы это испортили. Вы создаете временную динамическую очередь на основе имени в поле message.ReplyToQueueName, затем вы помещаете сообщение во временную динамическую очередь и, наконец, когда программа заканчивается (или фактически закрывает очередь), очередь удаляется (вместе с вашим сообщением).

Это правильный способ сделать это:

MQQueue outQ = null; 
MQPutMessageOptions pmo = new MQPutMessageOptions(); 
try 
{ 
    outQ = qmgr.AccessQueue(inMsg.ReplyToQueueName.Trim(), 
          MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING); 

    outQ.Put(outMsg, pmo); 
} 
catch (MQException mqe) 
{ 
    System.Console.WriteLine("MQException CC=" + mqe.CompletionCode + " : RC=" + mqe.ReasonCode); 
} 
finally 
{ 
    try 
    { 
     if (outQ != null) 
     outQ.Close(); // Close the Queue 
    } 
    catch (MQException mqe) 
    { 
     System.Console.WriteLine("MQException CC=" + mqe.CompletionCode + " : RC=" + mqe.ReasonCode); 
    } 
} 
Смежные вопросы