Перейти к содержимому
Kitegra
← Вернуться в блог

Модуль в этой статье: Integration Flow Helper

ProcessDirect и JMS в SAP CPI: как передавать headers между iFlow

Как передавать headers и exchange properties между iFlow в SAP CPI через ProcessDirect и JMS: совпадающие адреса и очереди, что передаётся и как это отлаживать.

ProcessDirect и JMS в SAP CPI: как передавать headers между iFlow

Большие интеграции в SAP CPI разбиваются на несколько iFlow: один принимает, другие обогащают, маппят или отправляют. ProcessDirect напрямую вызывает другой iFlow в том же tenant; JMS кладёт сообщение в очередь, которую другой iFlow читает позже. В обоих случаях вопрос один: какие из моих headers и свойств дойдут до другой стороны?

В этой статье объясняется, как настраиваются оба соединения, что через них проходит, а что нет, и как выяснить, почему значение потерялось между двумя iFlow.

ProcessDirect: один iFlow вызывает другой

Вызывающий iFlow, производитель, использует адаптер-получатель ProcessDirect. Вызываемый iFlow, потребитель, начинается с адаптера-отправителя ProcessDirect. У обоих есть поле Address, и вызов соединяется, только когда адрес на обеих сторонах в точности совпадает, например:

Producer iFlow  ->  ProcessDirect receiver   Address: /orders/enrich
Consumer iFlow  <-  ProcessDirect sender     Address: /orders/enrich

Оба iFlow выполняются в одном tenant, и потребитель должен быть развёрнут до того, как производитель сможет его вызвать. Слушать адрес может только один развёрнутый потребитель. При использовании с шагом Request-Reply итоговое сообщение потребителя возвращается производителю как ответ.

Что передаётся через ProcessDirect, а что нет

Потребитель получает тело сообщения и headers сообщения. Exchange properties остаются позади: потребитель начинает новый exchange без единого свойства производителя.

Чтобы передать свойство, скопируйте его в header с помощью Content Modifier непосредственно перед вызовом, например header orderId с типом источника Property и значением orderId. В потребителе скопируйте его обратно в свойство, если предпочитаете работать там со свойствами. Удалите headers, которые потребитель получать не должен, особенно большие.

JMS: передача сообщения через очередь

При JMS адаптер-получатель JMS производителя записывает сообщение в очередь, а iFlow-потребитель с адаптером-отправителем JMS на том же Queue Name его читает. Два iFlow развязаны: производитель не ждёт, а потребитель повторяет обработку сообщений, завершившихся ошибкой.

  • Headers сохраняются вместе с сообщением и доходят до потребителя.
  • Exchange properties не сохраняются, если в получателе JMS не включено Transfer Exchange Properties.
  • У всего, что сохраняется вместе с сообщением, есть ограничение по размеру, поэтому держите headers и передаваемые свойства небольшими.
  • В потребителе header SAPJMSRetries показывает, сколько раз сообщение уже повторялось.

Сравнение бок о бок

ProcessDirectJMS
Связь между iFlowОдинаковый Address на обеих сторонахОдинаковый Queue Name на обеих сторонах
ВызовПрямой, может вернуть ответАсинхронный, через очередь
Тело сообщенияПередаётсяПередаётся
HeadersПередаютсяПередаются
Exchange propertiesНе передаются: скопируйте их в headersПередаются только с Transfer Exchange Properties

Имена headers не чувствительны к регистру ни на одной из сторон, а имена exchange properties чувствительны, поэтому свойство, восстановленное в потребителе, должно быть написано ровно так, как его читают следующие шаги.

Когда значение не доходит

  1. Сравните адреса или имена очередей символ за символом, включая начальный слеш и регистр.
  2. Проверьте, что потребитель развёрнут и запущен.
  3. Проверьте, не было ли значение свойством: через ProcessDirect оно никогда не доходит; через JMS — только с Transfer Exchange Properties.
  4. Проверьте, что ни один Content Modifier не удаляет header на выходе из производителя.
  5. Запустите оба iFlow с уровнем журналирования Trace и сравните headers последнего шага производителя с headers первого шага потребителя.

Общие проверки описаны в статье о неизвестных headers и свойствах, а синтаксис чтения значений — в статье Выражения Camel Simple в SAP CPI.

Чем помогает Kitegra

Расширение браузера Kitegra отслеживает связи ProcessDirect и JMS между iFlow. В потребителе при вводе ${ или $ оно подсказывает headers, которые задают связанные iFlow, вместе с общими именами связей, так что вам не нужно открывать производителя, чтобы проверить написание.

Его навигатор показывает ваши tenants, пакеты и iFlow для каждого аккаунта SAP, так что можно перейти с одной стороны связи на другую. Расширение никогда не сохраняет, не развёртывает и не редактирует содержимое iFlow, а ваш tenant меняется только тогда, когда вы нажимаете одно из четырёх названных действий, и их можно отключить.

Чтобы проследить одно сообщение от производителя до потребителя, найдите его по Correlation ID: хронология перечисляет все iFlow, через которые оно прошло.

Без аккаунта Kitegra расширение работает на 5 iFlow в каждом модуле. Тариф Free охватывает 50, Starter — 100, Pro — 300; в Business ограничений нет. Сравните тарифы.

Попробуйте в следующем iFlow

Узнайте, что делает Kitegra в дизайнере SAP Integration Suite, или посмотрите его рядом с другими расширениями Kitegra для Chrome.

Частые вопросы

Передаются ли headers через ProcessDirect в SAP CPI?

Да. iFlow-потребитель получает тело сообщения и headers. Exchange properties не передаются.

Как передать exchange property в другой iFlow через ProcessDirect?

Скопируйте его в header с помощью Content Modifier перед вызовом ProcessDirect и, если оно там нужно, скопируйте обратно в свойство в потребителе.

Почему мой вызов ProcessDirect не соединяется?

Адреса различаются — хотя бы на один символ или слеш, — или iFlow-потребитель не развёрнут в том же tenant.

Сохраняет ли JMS exchange properties?

Только если в адаптере-получателе JMS включено Transfer Exchange Properties. Headers всегда сохраняются вместе с сообщением.

Как узнать, сколько раз повторялось сообщение JMS?

Читайте header SAPJMSRetries в iFlow-потребителе, например чтобы прекратить повторы после определённого числа попыток.

Могут ли два iFlow слушать один и тот же адрес ProcessDirect?

Нет. Адрес может использовать только один развёрнутый потребитель; дайте каждому потребителю свой.

Работайте с iFlows, не покидая дизайнер

Добавьте Kitegra в Chrome или Microsoft Edge. Начните бесплатно, без аккаунта.