この記事のモジュール: Integration Flow Helper
SAP CPI の ProcessDirect と JMS:iFlow 間で header を渡す方法
SAP CPI で ProcessDirect と JMS を使って iFlow 間で header と exchange property を渡す方法:一致させるアドレスとキュー、何が渡るか、デバッグのしかたを解説します。

SAP CPI の大きなインテグレーションは、複数の iFlow に分かれます。1 つが受信し、ほかの iFlow がエンリッチ、マッピング、送信を担います。ProcessDirect は同じ tenant 内の別の iFlow を直接呼び出し、JMS はメッセージをキューに入れて、別の iFlow が後で読み取ります。どちらの場合も問題は同じです。自分の header やプロパティのうち、どれが向こう側に届くのか。
この記事では、両方の接続の設定方法、何が渡り何が渡らないか、そして 2 つの iFlow の間で値が失われた理由を突き止める方法を説明します。
ProcessDirect:iFlow から別の iFlow を呼び出す
呼び出し側の iFlow(プロデューサー)は ProcessDirect レシーバーアダプターを使います。呼び出される iFlow(コンシューマー)は ProcessDirect センダーアダプターで始まります。どちらにも Address 欄があり、両側のアドレスが完全に一致したときだけ呼び出しがつながります。例:
Producer iFlow -> ProcessDirect receiver Address: /orders/enrich
Consumer iFlow <- ProcessDirect sender Address: /orders/enrich2 つの iFlow は同じ tenant で動き、プロデューサーが呼び出せるようになるには、コンシューマーが先にデプロイされている必要があります。1 つのアドレスで待ち受けられるのは、デプロイ済みのコンシューマー 1 つだけです。Request-Reply ステップと組み合わせると、コンシューマーの最終メッセージがレスポンスとしてプロデューサーに返ります。
ProcessDirect で渡るもの・渡らないもの
コンシューマーはメッセージボディとメッセージ header を受け取ります。exchange property は置き去りになり、コンシューマーはプロデューサーのプロパティを 1 つも持たない新しい exchange で始まります。
プロパティを渡すには、呼び出しの直前に Content Modifier で header にコピーします。たとえば、ソースタイプ Property、値 orderId の header orderId を作ります。コンシューマー側でプロパティとして扱いたい場合は、そこで再びプロパティにコピーします。コンシューマーが受け取るべきでない header、特に大きな header は削除してください。
JMS:キューを通してメッセージを渡す
JMS では、プロデューサーの JMS レシーバーアダプターがメッセージをキューに書き込み、同じ Queue Name を指定した JMS センダーアダプターを持つコンシューマー iFlow がそれを読み取ります。2 つの iFlow は疎結合になり、プロデューサーは待たず、コンシューマーは失敗したメッセージを再試行します。
- header はメッセージと一緒に保存され、コンシューマーに届きます。
- exchange property は、JMS レシーバーで Transfer Exchange Properties がオンになっていない限り保存されません。
- メッセージと一緒に保存されるものにはすべてサイズ上限があるため、header と転送するプロパティは小さく保ってください。
- コンシューマーでは、header
SAPJMSRetriesでメッセージが何回再試行されたかがわかります。
並べて比較
| ProcessDirect | JMS | |
|---|---|---|
| iFlow 間のリンク | 両方で同じ Address | 両方で同じ Queue Name |
| 呼び出し | 直接呼び出し、レスポンスを返せる | 非同期、キュー経由 |
| メッセージボディ | 渡る | 渡る |
| header | 渡る | 渡る |
| exchange property | 渡らない:header にコピーする | Transfer Exchange Properties がオンのときだけ渡る |
header 名はどちらの側でも大文字と小文字を区別しませんが、exchange property 名は区別します。そのため、コンシューマーで復元するプロパティは、後続のステップが読むときとまったく同じ綴りにする必要があります。
値が届かないとき
- アドレスまたはキュー名を 1 文字ずつ比べます。先頭のスラッシュや大文字と小文字も含めます。
- コンシューマーがデプロイされ、起動していることを確認します。
- その値がプロパティだったかを確認します。ProcessDirect では決して届かず、JMS では Transfer Exchange Properties がオンのときだけ届きます。
- プロデューサーの出口で、どの Content Modifier もその header を削除していないことを確認します。
- 両方の iFlow をログレベル Trace で実行し、プロデューサーの最後のステップとコンシューマーの最初のステップの header を比べます。
一般的なチェック方法は 未定義の header とプロパティに関する記事で、値を読み取る構文は SAP CPI の Camel Simple 式で説明しています。
Kitegra でできること
ブラウザー拡張機能 Kitegra は、iFlow 間の ProcessDirect と JMS のリンクをたどります。コンシューマーで ${ または $ と入力すると、つながっている iFlow が設定する header と、それらが共有するリンク名を候補に出すので、綴りを確かめるためにプロデューサーを開く必要はありません。
ナビゲーターには SAP アカウントごとに tenant、package、iFlow が並ぶので、リンクの一方の側からもう一方へすぐに移動できます。拡張機能が iFlow の内容を保存、デプロイ、編集することはありません。tenant が変更されるのは、名前の付いた 4 つの操作のいずれかをクリックしたときだけで、これらの操作はオフにすることもできます。
1 件のメッセージをプロデューサーからコンシューマーまで追うには、Correlation ID で検索してください。タイムラインに、そのメッセージが通ったすべての iFlow が表示されます。
Kitegra アカウントがなくても、モジュールごとに 5 つの iFlow で使えます。Free プランは 50、Starter は 100、Pro は 300 まで対応し、Business は上限なしです。プランを比較する。
次の iFlow で試してみましょう
Kitegra が SAP Integration Suite のデザイナーで何をするのかを読むか、Kitegra のほかの Chrome 拡張機能と並べて確認できます。
よくある質問
SAP CPI で header は ProcessDirect を通して渡りますか?
渡ります。コンシューマー iFlow はメッセージボディと header を受け取ります。exchange property は渡りません。
ProcessDirect で exchange property を別の iFlow に渡すにはどうすればよいですか?
ProcessDirect 呼び出しの前に Content Modifier で header にコピーし、コンシューマーで必要なら再びプロパティにコピーします。
ProcessDirect の呼び出しがつながらないのはなぜですか?
アドレスが 1 文字やスラッシュ 1 つでも違っているか、コンシューマー iFlow が同じ tenant にデプロイされていないためです。
JMS は exchange property を保持しますか?
JMS レシーバーアダプターで Transfer Exchange Properties がオンになっている場合だけです。header は常にメッセージと一緒に保存されます。
JMS メッセージが何回再試行されたかを知るにはどうすればよいですか?
コンシューマー iFlow で header SAPJMSRetries を読みます。たとえば、一定回数を超えたら再試行をやめるのに使えます。
2 つの iFlow が同じ ProcessDirect アドレスで待ち受けられますか?
できません。1 つのアドレスを使えるのはデプロイ済みのコンシューマー 1 つだけなので、コンシューマーごとに別のアドレスを割り当ててください。