作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写自定义 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/
我正在编写自定义 Java 代码以从 Websphere MQ(版本 8)读取消息并从 MQ 消息中读取所有 header 。 当我使用 MQHeaderList 解析所有 header 时,列表大小
我是一名优秀的程序员,十分优秀!