gpt4 book ai didi

java - Websphere MQ : reading from DLQ with JMS

转载 作者:行者123 更新时间:2023-12-01 19:28:39 25 4
gpt4 key购买 nike

我必须使用 JMS API 处理死信队列 (DLQ) 中的消息。目标是读取原始消息的正文及其用户属性。我意识到这种 DLQ 处理方法可能被认为是糟糕的设计,但无论如何我都必须处理它。

使用 JMS 读取后,DLQ 消息的正文包含原始消息的正文,前面带有 DL header 和与原始消息的 RFH2 header 非常相似的结构(因此包含所有需要的用户属性)。

问题是,java中如何解析这2个结构体?

但我只找到了一篇关于如何从原始数据构建 DLH 的文档 ( https://www.ibm.com/support/knowledgecenter/SS8JB4/com.ibm.wbpm.main.doc/topics/esbprog_bindings_wmq5.html )。但是,虽然 DLH 似乎是固定长度的结构,但 RFH2 绝对不是 - 因此解析中最棘手的部分就在那里。

任何想法将不胜感激。

更新

这是我发现的:

1)DLH是从原始字节数组解析出来的,没有任何问题,简单如下:

MQDLH rfh = new MQDLH(new DataInputStream(new ByteArrayInputStream(bytes)));

构建完成后,所有属性都可用。

2) 如果 MQLONG 值照常以大尾数法写入,则可以以类似的方式创建 MQRFH2。但由于某种原因,我完全不清楚,在这种情况下,所有 MQLONG 都是小端字节序。

因此,要从原始字节创建 MQRFH2,我必须反转所有 MQLONG 的字节。对于固定部分来说不是问题(如 https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q032000_.htm 中所述),但对于可变部分来说有点复杂。

我在文档中没有看到任何确认,但变量部分中的每个文件夹似乎都以包含文件夹长度的 MQLONG(好吧,只是 4 字节整数)开头。一旦这些值也从 LE 转换为 BE,MQRFH2 似乎就可以正常工作。

最佳答案

我不会使用 JMS 应用程序处理 DLQ。这将是非常非常棘手的,你会花几天或几周的时间试图把它做好。我会编写一个常规的 Java 应用程序来完成它,这要简单得多。

MQMessage rcvMsg = new MQMessage();
MQDLH dlh = new MQDLH(rcvMsg);
MQRFH2 rfh2 = new MQRFH2(rcvMsg);
byte[] bData = new byte[rcvMsg.getDataLength()];
rcvMsg.readFully(bData);
<小时/>

于 2020 年 3 月 4 日更新。

我通常不喜欢用头撞墙,但如果你愿意,那么这里是我会尝试的代码:

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInput di = new DataInputStream(bais);

MQDLH dlh = new MQDLH(di);
MQRFH2 rfh2 = new MQRFH2(di)

// Get all folders
String[] folderStrings = rfh2.getFolderStrings();

// or you can get individual name/values using
// get***FieldValue() methods of the MQRFH2 class.

/*
* At this point, the cursor for "di" is pointing
* to the beginning of the message payload and I
* would normal do:
*/
byte[] bData = new byte[mqMsg.getDataLength()];
mqMsg.readFully(bData);

关于java - Websphere MQ : reading from DLQ with JMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60515837/

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