使用 JAVA 访问 IIB 中的消息内容
Accessing message content in IIB using JAVA
有谁知道如何访问 Java 计算节点中 MbMessage 的内容?我正在使用 IBM integration Toolkit 10,到目前为止我只知道 Message 由一个带有各种子元素的根元素组成。
我从 MQ 收到 JSON 文本,我只需要在计算节点中访问它,修改它并将它发送到 Azure 服务总线,但我很难访问 JSON 文本来自消息。
我尝试访问各种 MbMessage 元素,但没有从中获得任何合理的值。我将输出作为异常放入错误日志中。我得到的唯一合理数据来自 Chapter 元素,但我猜格式是十六进制的。看到这个:
"7b224865616422203a207b22536f7572636553797374656d223a224d565844445441505244222c2022546172676574223a2241677265656d656e74222c2022416374696f6e223a2264656c657465222c20224d6573736167654964223a22222c2022436f72656c6174696f6e4964223a22222c2254696d657374616d70223a223230313930333230313631383531333636373230303030303030222c20224368616e67654964223a22227d2c224974656d7322203a207b2241677265656d656e744964223a225357453134305f36303736343336222c224d616368696e654b6579223a2231313131303337313333222c2241677265656d656e74436c617373223a22353631222c2241677265656d656e744e756d626572223a2242303638323135222c224c696e654e756d626572223a22315f3330222c22436f6e74726163746564486f757273223a22313030222c2241677265656d656e7456616c696446726f6d223a223230313930333132222c2241677265656d656e7456616c6964546f223a223230323230333131222c224c6173744d6f646966696564223a223230313930333230313631383531333636373230303030303030222c22497349536974654f726967696e61746564223a2230222c22497344656c657"
// This is how i see in log what is in the element value of a chapter
if(true){
throw new Exception("Message Content: " + outMessage.getRootElement().getLastChild().getLastChild().getValueAsString());
}
我希望收到发送到消息队列的 JSON 文本。
所以我怀疑前面的输入节点或您的代码指定了 BLOB 解析器而不是 JSON 解析器。顺便说一句,如果您没有提供解析器的名称,则默认使用 BLOB 解析器。
提供部分 BLOB
7b224865616422203a207b22536f7572636553797374656d223a224d565844445441505244222c2022546172676574223a2241677265656d656e74222c20
进入十六进制到 ASCII 转换器 https://www.rapidtables.com/convert/number/hex-to-ascii.html,你会得到
{"Head" : {"SourceSystem":"MVXDDTAPRD", "Target":"Agreement",
这实质上告诉您您的消息尚未被解析。
我提供了几个 HTTPInput 节点的屏幕截图,您通常会在输入和输出节点的属性编辑器中找到 Input/Output 消息解析选项卡。
一旦解决了解析器问题,就可以开始遍历输入树并构建输出树。下图来自此 link https://www.ibm.com/support/knowledgecenter/en/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ac69091_.htm 并显示了元素树的结构。请注意,在您的情况下,XML 节点实际上是 JSON
如果您知道这些名称,则可以使用 XPath 获取元素引用。
MbElement inputRoot = inputMessageAssembly.getMessage().getRootElement();
MbElement srcSys = inputRoot.getFirstElementByPath("/JSON/Data/Head/SourceSystem");
要告诉 IIB 输出消息应该在 JSON 中,您需要像这样为其提供 JSON 解析器的名称。
MbMessage outMessage = new MbMessage();
MbElement outRoot = outMessage.getRootElement();
MbElement outBody = outRoot.createElementAsLastChild(MbJSON.PARSER_NAME);
最后但同样重要的是,您当前的代码行现在可能会显示空字符串或 null,因为您要导航到的元素没有任何值,只有一个名称。
参考资料:
搜索 MbElement 可获得 https://www.ibm.com/support/knowledgecenter/en/SSMKHH_9.0.0/com.ibm.etools.mft.plugin.doc/com/ibm/broker/plugin/MbElement.html
搜索 Java 代码示例 MbElement 将为您提供此 link,它显示了如何使用 MbElement class。 https://www.programcreek.com/java-api-examples/?api=com.ibm.broker.plugin.MbElement
如果要看元素树的结构,有几个${Root} ${Environment} ${LocalEnvironment} ${ExceptionList},然后添加Trace节点。您几乎可以将它们放在任何您喜欢的地方。下面的屏幕截图来自另一个答案,但很好地说明了它们的用途。请注意,输出文件由 Trace 节点保持打开状态,刷新缓冲区的最简单方法是停止并重新启动流,重新部署也可以。
有谁知道如何访问 Java 计算节点中 MbMessage 的内容?我正在使用 IBM integration Toolkit 10,到目前为止我只知道 Message 由一个带有各种子元素的根元素组成。
我从 MQ 收到 JSON 文本,我只需要在计算节点中访问它,修改它并将它发送到 Azure 服务总线,但我很难访问 JSON 文本来自消息。
我尝试访问各种 MbMessage 元素,但没有从中获得任何合理的值。我将输出作为异常放入错误日志中。我得到的唯一合理数据来自 Chapter 元素,但我猜格式是十六进制的。看到这个:
"7b224865616422203a207b22536f7572636553797374656d223a224d565844445441505244222c2022546172676574223a2241677265656d656e74222c2022416374696f6e223a2264656c657465222c20224d6573736167654964223a22222c2022436f72656c6174696f6e4964223a22222c2254696d657374616d70223a223230313930333230313631383531333636373230303030303030222c20224368616e67654964223a22227d2c224974656d7322203a207b2241677265656d656e744964223a225357453134305f36303736343336222c224d616368696e654b6579223a2231313131303337313333222c2241677265656d656e74436c617373223a22353631222c2241677265656d656e744e756d626572223a2242303638323135222c224c696e654e756d626572223a22315f3330222c22436f6e74726163746564486f757273223a22313030222c2241677265656d656e7456616c696446726f6d223a223230313930333132222c2241677265656d656e7456616c6964546f223a223230323230333131222c224c6173744d6f646966696564223a223230313930333230313631383531333636373230303030303030222c22497349536974654f726967696e61746564223a2230222c22497344656c657"
// This is how i see in log what is in the element value of a chapter
if(true){
throw new Exception("Message Content: " + outMessage.getRootElement().getLastChild().getLastChild().getValueAsString());
}
我希望收到发送到消息队列的 JSON 文本。
所以我怀疑前面的输入节点或您的代码指定了 BLOB 解析器而不是 JSON 解析器。顺便说一句,如果您没有提供解析器的名称,则默认使用 BLOB 解析器。
提供部分 BLOB
7b224865616422203a207b22536f7572636553797374656d223a224d565844445441505244222c2022546172676574223a2241677265656d656e74222c20
进入十六进制到 ASCII 转换器 https://www.rapidtables.com/convert/number/hex-to-ascii.html,你会得到
{"Head" : {"SourceSystem":"MVXDDTAPRD", "Target":"Agreement",
这实质上告诉您您的消息尚未被解析。
我提供了几个 HTTPInput 节点的屏幕截图,您通常会在输入和输出节点的属性编辑器中找到 Input/Output 消息解析选项卡。
一旦解决了解析器问题,就可以开始遍历输入树并构建输出树。下图来自此 link https://www.ibm.com/support/knowledgecenter/en/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ac69091_.htm 并显示了元素树的结构。请注意,在您的情况下,XML 节点实际上是 JSON
如果您知道这些名称,则可以使用 XPath 获取元素引用。
MbElement inputRoot = inputMessageAssembly.getMessage().getRootElement();
MbElement srcSys = inputRoot.getFirstElementByPath("/JSON/Data/Head/SourceSystem");
要告诉 IIB 输出消息应该在 JSON 中,您需要像这样为其提供 JSON 解析器的名称。
MbMessage outMessage = new MbMessage();
MbElement outRoot = outMessage.getRootElement();
MbElement outBody = outRoot.createElementAsLastChild(MbJSON.PARSER_NAME);
最后但同样重要的是,您当前的代码行现在可能会显示空字符串或 null,因为您要导航到的元素没有任何值,只有一个名称。
参考资料: 搜索 MbElement 可获得 https://www.ibm.com/support/knowledgecenter/en/SSMKHH_9.0.0/com.ibm.etools.mft.plugin.doc/com/ibm/broker/plugin/MbElement.html
搜索 Java 代码示例 MbElement 将为您提供此 link,它显示了如何使用 MbElement class。 https://www.programcreek.com/java-api-examples/?api=com.ibm.broker.plugin.MbElement
如果要看元素树的结构,有几个${Root} ${Environment} ${LocalEnvironment} ${ExceptionList},然后添加Trace节点。您几乎可以将它们放在任何您喜欢的地方。下面的屏幕截图来自另一个答案,但很好地说明了它们的用途。请注意,输出文件由 Trace 节点保持打开状态,刷新缓冲区的最简单方法是停止并重新启动流,重新部署也可以。