有人知道如何在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文本。
答案 0 :(得分:2)
因此,我怀疑前面的输入节点或您的代码已经指定了BLOB解析器而不是JSON解析器。顺便说一句,如果您没有提供解析器的名称,则BLOB解析器是默认的。
提供BLOB的一部分
7b224865616422203a207b22536f7572636553797374656d223a224d565844445441505244222c2022546172676574223a2241677265656d656e74222c20
进入十六进制ASCII转换器https://www.rapidtables.com/convert/number/hex-to-ascii.html,您将得到
{"Head" : {"SourceSystem":"MVXDDTAPRD", "Target":"Agreement",
从本质上告诉您,您的消息尚未解析。
我已经为HTTPInput节点提供了几个屏幕截图,通常可以在Input and Output节点的Properties编辑器中找到Input / Output Messaging Parsing选项卡。
解决解析器问题后,就可以开始遍历输入树并构建输出树了。下图来自此链接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将为您提供此链接,该链接显示了如何使用MbElement类。 https://www.programcreek.com/java-api-examples/?api=com.ibm.broker.plugin.MbElement
如果要查看元素树的结构,则有几个$ {Root} $ {Environment} $ {LocalEnvironment} $ {ExceptionList},然后添加Trace节点。您可以将它们放在几乎任何您喜欢的位置。下面的屏幕截图来自另一个答案,但很好地说明了它们的用法。请注意,输出文件由“跟踪”节点保持打开状态,刷新缓冲区的最简单方法是停止并重新启动流,重新部署也可以。