Доступ к содержимому сообщения в IIB с использованием JAVA - PullRequest
2 голосов
/ 17 мая 2019

Кто-нибудь знает, как получить доступ к содержимому MbMessage в вычислительном узле Java? Я использую IBM Integration Toolkit 10 и до сих пор понимаю, что Message состоит из корневого элемента с различными дочерними элементами.

Я получаю текст JSON из MQ, и мне просто нужно получить доступ к нему в вычислительном узле, изменить его и отправить его на служебную шину 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, который отправляю в очередь сообщений.

1 Ответ

2 голосов
/ 18 мая 2019

Так что я подозреваю, что предыдущий узел ввода или ваш код в этом отношении указали синтаксический анализатор BLOB, а не анализатор JSON. Кстати, если вы не указали имя анализатора, BLOB-анализатор используется по умолчанию.

Подающая часть BLOB

7b224865616422203a207b22536f7572636553797374656d223a224d565844445441505244222c2022546172676574223a2241677265656d656e74222c20 

В преобразователь Hex в ASCII https://www.rapidtables.com/convert/number/hex-to-ascii.html и вы получите

 {"Head" : {"SourceSystem":"MVXDDTAPRD", "Target":"Agreement",   

Что, по сути, говорит о том, что ваше сообщение не было проанализировано.

Я включил пару снимков экрана для узла HTTPInput, вы обычно найдете вкладку «Синтаксический анализ сообщений ввода / вывода» в редакторе свойств узлов ввода и вывода.

BLOB Parser Selected

JSON Parser Selected

Как только вы разберетесь с проблемой синтаксического анализатора, вы можете начать обходить дерево ввода и строить дерево вывода. Диаграмма ниже взята из этой ссылки https://www.ibm.com/support/knowledgecenter/en/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ac69091_.htm и показывает, как структурировано дерево элементов. Обратите внимание, что в вашем случае узел XML на самом деле будет JSON

Traversing the Element Tree

Если вы знаете имена, вы можете получить ссылку на элемент с помощью 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);

Последняя, ​​но не менее важная строка вашего кода теперь может отображать пустую строку или ноль, так как элемент, по которому вы перемещаетесь, не имеет значения, кроме имени.

Ссылка: Поиск по 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. Вы можете поместить их почти везде, где захотите. Скриншоты ниже взяты из другого ответа, но хорошо иллюстрируют их использование. Имейте в виду, что выходной файл остается открытым узлом Trace, самый простой способ очистить буферы - остановить и перезапустить поток, повторное развертывание также работает.

Simple Soap Flow

Trace Node Configuration

...