Замените IBM MQ Message Payload и ответьте тем же сообщением в Java (без JMS) - PullRequest
0 голосов
/ 31 января 2020

У нас есть требование отвечать на очередь ответов тем же сообщением из очереди запросов после обработки полезной нагрузки. Я столкнулся с проблемой при попытке записать строку во входящее сообщение. Сообщение обработки добавляется к существующей полезной нагрузке. Вот фрагмент кода, который я использую

public void readFromQueue(String reqQueue, String queueMgrName) {
        int depth = 0;
        MQQueueManager queueMgr = null;
        MQQueue queue = null;
        MQHeaderList headerList = null;
        try {
            queueMgr = getQueueManager(); //queue manager is initiated
            queue = getQueue("get", queueMgr); // queue is intiated
            MQGetMessageOptions getOptions = new MQGetMessageOptions(); // Message GET options
            getOptions.options = MQConstants.MQGMO_WAIT + MQConstants.MQGMO_FAIL_IF_QUIESCING + 
                                 MQConstants.MQGMO_COMPLETE_MSG + 
                                 MQConstants.MQGMO_PROPERTIES_FORCE_MQRFH2;
            byte[] b = null;
            while (true) {
                try {
                    message = new MQMessage();
                    queue.get(message, getOptions);
                    headerList = new MQHeaderList(message, true);
                    processMessage(headerList, message);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                } 
             }
}

public void processMessage(MQHeaderList headerList, MQMessage message) {
      String receivedRequest = headerList.getBody().toString();
      /* ---- Message processing logic here ---- */
      message.writeString(outMessage);
      writeToQueue(message);
}   
public void writeToQueue (MQMessage putMsg)
            throws MQDataException, ConfigurationException { 
        MQQueueManager queueMgr = null;
        MQQueue queue = null;
        try {
            queueMgr = getQueueManager();
            queue = getQueue("put", queueMgr);
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            queue.put(putMsg, pmo);
            queueMgr.commit();
        }
        catch (Exception mqex) {
            System.out.println(mqex);
        } 
}

Пример сообщения полезной нагрузки:

{
   Msg:{
        MsgHeader: {
            headerKey1: headerValue1,
            headerKey2: headerValue2
        },
        MsgBody: {
            bodyKey1: bodyValue1,
            bodyKey2: bodyValue2
        }
}

Ожидаемая полезная нагрузка в ответном сообщении:

{
   Msg:{
        MsgHeader: {
            headerKey1: headerValue1,
            headerKey2: headerValue2
        },
        MsgBody: {
            newBodyKey1: newBodyValue1,
            newBodyKey2: newBodyValue2,
        }
} 

Активная полезная нагрузка в ответе сообщение: (добавляется к фактической полезной нагрузке вместо ее замены)

{
   Msg:{
        MsgHeader: {
            headerKey1: headerValue1,
            headerKey2: headerValue2
        },
        MsgBody: {
            bodyKey1: bodyValue1,
            bodyKey2: bodyValue2
        }
}
{
   Msg:{
        MsgHeader: {
            headerKey1: headerValue1,
            headerKey2: headerValue2
        },
        MsgBody: {
            newBodyKey1: newBodyValue1,
            newBodyKey2: newBodyValue2,
        }
} 

Пожалуйста, помогите мне решить эту проблему

1 Ответ

2 голосов
/ 31 января 2020

Я не понимаю, почему вы используете класс MQHeaderList. Сколько внутренних заголовков MQ содержится в исходном сообщении запроса?

Кроме того, вы пытаетесь поместить объекты MQMessage в JSON объект, потому что ваше описание очень запутанно.

Звучит так, как будто вы макет сообщения запроса:

{RFH2 header}{mcd folder}{jms folder}{usr folder}{message payload}

И вы хотите, чтобы ответное сообщение было:

{RFH2 header}{mcd folder}{jms folder}{usr folder}{updated message payload}

, где заголовок RFH2, папка mcd, папка jms и папка usr содержат исходные значения сообщение с запросом.

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


Обновлено: 3 февраля 2020 г.

Чтобы получить полезную нагрузку сообщения из сообщения запроса, просто выполните следующее:

String msgStr = null;
if (CMQC.MQFMT_STRING.equals(rfh2.getFormat()))
{
   msgStr = requestMsg.readStringOfByteLength(requestMsg.getDataLength());
}
else
{
   byte[] b = new byte[requestMsg.getDataLength()];
   requestMsg.readFully(b);
   msgStr = new String(b);
}
...