私が知る限り、WSO2 ESB は、応答メッセージを返さないサービス操作のプロキシを適切に処理しません。
シナリオは次のとおりです。
WSO2 アプリケーション サーバー 4.1.0 上に、コード ファーストで axis2 によって生成された Web サービスがあります。
サービスが基づいている Java クラスには、次のようないくつかのメソッドがあります。
public void updateMyObject(MyObject obj) throws MyServiceException
Axis2 は応答メッセージを含まない WSDL を生成するため、これは基本的に一方向です。
注意: この操作に対して動作する axis2 生成のクライアント スタブは正常に動作します。クライアント コードでスタブを呼び出すと、操作がサーバーによって正常に処理されるまで、クライアントはブロックされます。サーバーでエラーが発生すると、カスタム フォールトが発生し、クライアント側で例外がスローされます。
ただし、ESB を介してこの呼び出しを行いたいと考えています。単純で基本的なプロキシ サーバーをセットアップしても機能しません。ESB 経由でサービスを呼び出すと、リモート サービスが正常に呼び出された場合でも、クライアント コードが無期限にブロックされます。
inSequence に以下を追加することでこれを修正できることをどこかで読みました。
<property action="set" name="OUT_ONLY" value="true"/>
<property action="set" name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
これは、リモート サービスが応答を正常に処理した場合に有効です。クライアント コードはブロックされなくなりました。
ただし、リクエストの処理中にエラーが発生した場合、クライアントはそれを知りません。ESB は基本的にエラーを「食べます」。
OUT_ONLY が設定されているため、操作用にコールバック ハンドラが登録されていないため、これは疑いの余地がありません。詳細については、以下のリンクで OUT_ONLY を検索してください。
http://techfeast-hiranya.blogspot.ca/2009/12/wso2-esb-tips-tricks-03-transport.html
FORCE_SC_ACCEPTED 設定は、クライアントが成功条件でブロックされないようにするためのもののようです。おそらく、クライアントに 202 http 応答を強制するため、応答の待機を停止するためです。
クライアントは成功条件とエラー条件の両方でサービスに対して正常に動作しますが、同じ動作をもたらすプロキシ サービスを構成することができないため、私の意見では、ESB にはこの点で欠陥があり、それはバグです。
もちろん、自分のやりたいように設定できる方法があれば、ぜひ聞いてみたいです。
しかし、私が知る限り、応答がなくてもコールバックを登録しないことは間違っていると思います。火をつけてここで忘れたくありません。実行は、引き続きクライアント側から同期的に行われる必要があります。私のクライアントは HTTP 200 応答を期待していますが、成功のための本文がありません。
WSDL を調べることで、ESB はサービスに応答メッセージがないことを認識する必要がありますが、それでもコールバックを登録します。成功時に 200 OK を受信すると、これをクライアントに伝達し、コールバックを登録解除する必要があります。障害が発生すると、それをクライアントに中継する必要もあります。
それで、ESBで私が望むことを達成する方法はありますか、それともこの方法では不十分ですか?