替换IBM MQ消息负载,并用Java中的相同消息进行回复(不带JMS)

替换IBM MQ消息负载,并用Java中的相同消息进行回复(不带JMS),java,ibm-mq,Java,Ibm Mq,我们需要在处理有效负载后使用来自请求队列的相同消息回复响应队列。我在尝试将字符串写入传入消息时遇到问题。正在将处理消息附加到现有有效负载。下面是我正在使用的代码片段 public void readFromQueue(String reqQueue, String queueMgrName) { int depth = 0; MQQueueManager queueMgr = null; MQQueue queue = null;

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

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,
        }
} 
响应消息中的实际有效负载:(附加到实际有效负载,而不是替换它)


请帮助我解决此问题

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

如果这是你正在尝试做的,那么看看另一个博客,看看它是否符合你正在尝试做的


更新日期: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);
}

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

如果这是你正在尝试做的,那么看看另一个博客,看看它是否符合你正在尝试做的


更新日期: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);
}

这似乎是应用程序消息处理逻辑中的一个问题。MQ将放置应用程序提供的任何消息负载。检查您的消息处理逻辑。感谢您的输入。处理的消息也可以是一个小的JSON字符串。问题是每次在回复消息中,它都会被附加到原始有效负载上
message
已经包含正文,为什么要再次追加它?或者调用
message.clearMessage()
在调用
writeString
之前清除传入的消息缓冲区。为什么不在句柄中设置
MQGMO属性?
?这似乎是应用程序消息处理逻辑中的问题。MQ将放置应用程序提供的任何消息负载。检查您的消息处理逻辑。感谢您的输入。处理的消息也可以是一个小的JSON字符串。问题是每次在回复消息中,它都会被附加到原始有效负载上
message
已经包含了正文,为什么要再次追加它?或者在调用
writeString
之前调用
message.clearMessage()
清除传入消息缓冲区。为什么不在句柄中设置
MQGMO属性?
?非常感谢您的输入和帮助。我必须抓取{messagepayload}并用您提到的{updated message payload}替换它。当我试图获取MQRFH2头以将其设置为响应消息时,消息负载读取引发异常。这就是为什么我使用MQHeaderList使用getBody()方法获取主体并对其进行处理。在这个过程中,它作为{messagepayload}{updated messagepayload}追加。但在您的示例中,您正在使用现有标题编写一个静态文本来响应消息。请帮助我。如果您想要请求消息的消息负载,请参阅上面我的更新答案。注意if语句。它正在检查RFH2结构中的格式字段,而不是消息的MQMD.Ok的格式字段。我在博客帖子中更新了我原来的MQTest77.java,以便根据传入请求消息有效负载的校验和生成Powerball编号。因此,回复消息没有任何静态特性。请看我的评论:非常感谢您的投入和努力,帮助我走出困境。我必须抓取{messagepayload}并用您提到的{updated message payload}替换它。当我试图获取MQRFH2头以将其设置为响应消息时,消息负载读取引发异常。这就是为什么我使用MQHeaderList使用getBody()方法获取主体并对其进行处理。在这个过程中,它作为{messagepayload}{updated messagepayload}追加。但在您的示例中,您正在使用现有标题编写一个静态文本来响应消息。请帮助我。如果您想要请求消息的消息负载,请参阅上面我的更新答案。注意if语句。它正在检查RFH2结构中的格式字段,而不是消息的MQMD.Ok的格式字段。我在博客帖子中更新了我原来的MQTest77.java,以便根据传入请求消息有效负载的校验和生成Powerball编号。因此,回复消息没有任何静态特性。请看我的评论: