【发布时间】: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?