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

Большие интеграции в 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показывает, сколько раз сообщение уже повторялось.
Сравнение бок о бок
| ProcessDirect | JMS | |
|---|---|---|
| Связь между iFlow | Одинаковый Address на обеих сторонах | Одинаковый Queue Name на обеих сторонах |
| Вызов | Прямой, может вернуть ответ | Асинхронный, через очередь |
| Тело сообщения | Передаётся | Передаётся |
| Headers | Передаются | Передаются |
| Exchange properties | Не передаются: скопируйте их в headers | Передаются только с Transfer Exchange Properties |
Имена headers не чувствительны к регистру ни на одной из сторон, а имена exchange properties чувствительны, поэтому свойство, восстановленное в потребителе, должно быть написано ровно так, как его читают следующие шаги.
Когда значение не доходит
- Сравните адреса или имена очередей символ за символом, включая начальный слеш и регистр.
- Проверьте, что потребитель развёрнут и запущен.
- Проверьте, не было ли значение свойством: через ProcessDirect оно никогда не доходит; через JMS — только с Transfer Exchange Properties.
- Проверьте, что ни один Content Modifier не удаляет header на выходе из производителя.
- Запустите оба 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?
Нет. Адрес может использовать только один развёрнутый потребитель; дайте каждому потребителю свой.