【问题标题】:Replace IBM MQ Message Payload and reply with same message in Java (Without JMS)用 Java 中的相同消息替换 IBM MQ 消息有效负载并回复(无 JMS)
【发布时间】:2020-02-04 01:25:38
【问题描述】:

我们需要在处理有效负载后使用来自请求队列的相同消息回复响应队列。我在尝试将字符串写入传入消息时遇到问题。处理消息被附加到现有的有效负载中。这是我正在使用的代码 sn-p

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,
        }
} 

请帮我解决这个问题

【问题讨论】:

  • 您的应用程序消息处理逻辑似乎有问题。 MQ 将放置您的应用程序提供的任何消息负载。检查您的消息处理逻辑。
  • 感谢您的意见。处理后的消息也可以是一个小的 JSON 字符串。问题是它每次都在回复消息中附加到原始有效负载。
  • 摆脱这个message.writeString(outMessage);message 已经包含正文了,为什么还要再追加呢?
  • 或者在调用writeString之前调用message.clearMessage()清除传入的消息缓冲区。
  • 为什么不设置MQGMO_PROPERTIES_IN_HANDLE

标签: java ibm-mq


【解决方案1】:

我不明白您为什么要使用 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 文件夹包含请求消息的原始值。

如果这是你想要做的,那么看看另一个博客posting,看看它是否符合你想要做的事情。


更新日期:2020 年 2 月 3 日。

要从请求消息中获取消息负载,只需执行以下操作:

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);
}

【讨论】:

  • 非常感谢您的投入和帮助我的努力。正如您提到的,我必须获取 {message payload} 并将其替换为 {updated message payload}。当我尝试获取 MQRFH2 标头以将它们设置为响应消息时,消息有效负载读取抛出异常。这就是为什么我使用 MQHeaderList 使用 getBody() 方法来抓取正文并进行处理。在此过程中,它附加为 {message payload}{updated message payload}。但是在您的示例中,您正在编写带有现有标题的静态文本以响应消息。请帮帮我。
  • 如果您想要请求消息的消息有效负载,请参阅上面的更新答案。注意 if 语句。它正在检查 RFH2 结构中的格式字段,而不是消息的 MQMD 的格式字段。
  • 好的。我在博客文章中更新了我原来的 MQTest77.java,以根据传入请求消息的有效负载的校验和生成强力球号码。因此,回复消息没有什么静态的。在这里查看我的 cmets:capitalware.com/rl_blog/?p=5810
猜你喜欢
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多