gpt4 book ai didi

ibm-mq - MQHeaderList 大小为 0,但读取特定 MQRFH2 有效

转载 作者:行者123 更新时间:2023-12-04 15:26:23 57 4
gpt4 key购买 nike

我正在编写自定义 Java 代码以从 Websphere MQ(版本 8)读取消息并从 MQ 消息中读取所有 header 。

当我使用 MQHeaderList 解析所有 header 时,列表大小为 0:

MQMessage message = new MQMessage();
queue.get(message, getOptions);
DataInput in = new DataInputStream (new ByteArrayInputStream (b));
MQHeaderList headersfoundlist = null;
headersfoundlist = new MQHeaderList (in);
System.out.println("headersfoundlist size: " + headersfoundlist.size());

但是,我只阅读了它工作的特定 MQRFH2

MQMessage message = new MQMessage();
queue.get(message, getOptions);
DataInput in = new DataInputStream (new ByteArrayInputStream (b));
MQRFH2 rfh2 = new MQRFH2(in);
Element usrfolder = rfh2.getFolder("usr", false);
System.out.println("usr folder" + usrfolder);

如何解析 MQ 消息的所有 header ?

最佳答案

DataInput in = new DataInputStream (new ByteArrayInputStream (b));

那是什么?不确定为什么要这样做。

它应该只是:

MQMessage message = new MQMessage();
queue.get(message, getOptions);
MQHeaderList headersfoundlist = new MQHeaderList(message);
System.out.println("headersfoundlist size: " + headersfoundlist.size());

阅读更多 here .


更新:

@anshu 关于它不起作用的评论,好吧,我一直发现 MQHeaderList 类非常有问题。因此,这就是我不使用它的原因。

此外,MQ 中 99.99% 的消息只会有 1 个嵌入式 MQ header (即 MQRFH2)。注意:JMS 消息 == MQRFH2 消息。您会发现 2 个嵌入式 MQ header 的唯一情况是死信队列中的消息。

{MQDLH}{MQRFH2}{消息负载}

您的应用程序是否真的需要处理多个嵌入式 MQ header ?您的应用程序是否正在发送/接收 JMS 消息(也称为 MQRFH2 消息)?

如果是这样,那么您应该执行以下操作:

queue.get(receiveMsg, gmo);

if (CMQC.MQFMT_RF_HEADER_2.equals(receiveMsg.format))
{
receiveMsg.seek(0);
MQRFH2 rfh2 = new MQRFH2(receiveMsg);

int strucLen = rfh2.getStrucLength();
int encoding = rfh2.getEncoding();
int CCSID = rfh2.getCodedCharSetId();
String format= rfh2.getFormat();
int flags = rfh2.getFlags();
int nameValueCCSID = rfh2.getNameValueCCSID();

String[] folderStrings = rfh2.getFolderStrings();
for (String folder : folderStrings)
System.out.println.logger("Folder: "+folder);

if (CMQC.MQFMT_STRING.equals(format))
{
String msgStr = receiveMsg.readStringOfByteLength(receiveMsg.getDataLength());
System.out.println.logger("Data: "+msgStr);
}
else if (CMQC.MQFMT_NONE.equals(format))
{
byte[] b = new byte[receiveMsg.getDataLength()];
receiveMsg.readFully(b);
System.out.println.logger("Data: "+new String(b));
}
}
else if ( (CMQC.MQFMT_STRING.equals(receiveMsg.format)) ||
(CMQC.MQFMT_NONE.equals(receiveMsg.format)) )
{
Enumeration<String> props = receiveMsg.getPropertyNames("%");
if (props != null)
{
System.out.println.logger("Named Properties:");
while (props.hasMoreElements())
{
String propName = props.nextElement();
Object o = receiveMsg.getObjectProperty(propName);
System.out.println.logger(" Name="+propName+" : Value="+o);
}
}

if (CMQC.MQFMT_STRING.equals(receiveMsg.format))
{
String msgStr = receiveMsg.readStringOfByteLength(receiveMsg.getMessageLength());
System.out.println.logger("Data: "+msgStr);
}
else
{
byte[] b = new byte[receiveMsg.getMessageLength()];
receiveMsg.readFully(b);
System.out.println.logger("Data: "+new String(b));
}
}
else
{
byte[] b = new byte[receiveMsg.getMessageLength()];
receiveMsg.readFully(b);
System.out.println.logger("Data: "+new String(b));
}

关于ibm-mq - MQHeaderList 大小为 0,但读取特定 MQRFH2 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62163148/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com