Web Serviceビジネスオペレーション – 応答タイムアウト時の動作
Webサービスを呼び出す際、ビジネスオペレーションには、規定時間内に応答が返されない場合の動作を制御する設定があります。
(これは、例えば、SOAPでない単純なHTTP呼び出しにも関係しているので注意してください)
関連する3つの主な設定は次のとおりです。
リモートWebサーバーから応答を受信するためのタイムアウトを指定します。
Ensembleの外部の宛先との接続を試行するまで待機する秒数。
Ensembleの外部の宛先との接続を試行し続ける合計秒数。 この秒数が経過すると、ビジネスオペレーションはメッセージのデータを破棄し、エラーコードを返します。
文章でまとめると、これらは次のように連携します。
Webサーバーからの応答を「応答タイムアウト」秒待ちます。 その時間までに応答がない場合は、「再試行間隔」秒が経過した後、Webサーバーを再度呼び出します。 これを、最初の試行が開始されてから「失敗タイムアウト」秒が経過するまで試行し続けます。
次の例で説明します。
次の設定を想定します。
文章にすると、
応答タイムアウト - 応答を7秒間待機します
再試行間隔 - 10秒ごとに再試行します
失敗タイムアウト - 30秒が経過したら試行を「諦める」
したがって、応答がちょうど8秒後に戻ってきた場合は、次のシナリオが発生します。
- 00:00に最初の呼び出しを実行します
- 00:07に応答が返されないため、「応答タイムアウト」エラーが発生したことを内部的に確認し(イベントログに「エラーイベント」を記録し)、再試行ポリシーと設定に従って再試行します。 「失敗タイムアウト」にはまだ到達していないため、「再試行が必要」のフラグが立てられます。
- [ 00:08に、Webサーバーは応答を返しますが、タイムアウトですでにエラーが発生しているため、この応答は受信されません ]
- 00:10に再試行間隔に到達し、「再試行が必要」フラグが立てられているので、Webサーバーを再度呼び出します。
- 00:17に、応答がなく「応答タイムアウト」に再び到達します(前述したとおり、00:08/3番目のステップで返された応答が「無視/破棄」されてるので注意してください)。したがって、これも内部的にエラーとして示し(しかし、今回は別のイベントログエラーエントリは追加されません。イベントログエラーエントリは、最初の試行でのみ作成され、すべての再試行失敗で作成されるわけではありません。)「失敗タイムアウト」にまだ達していないため、再度「再試行が必要」フラグが立てられます。
- [ 00:18に、Webサーバーは応答を返しますが、これも受信されません ]
- 00:20に別の再試行間隔が経過して、3番目の再試行が行われます。
- 00:27に応答がなく、再び「応答タイムアウト」エラーが発生し、(失敗タイムアウト」にはまだ達していないため)再試行します。
- [ 00:28に、受信されない応答がサーバーから送信されます ]
- 00:30にまた再試行間隔に到達し、4番目(最後)の試行が行われます。
- 00:37に「応答タイムアウト」が再び発生します。今回は「失敗タイムアウト」を超過しているめ、「再試行が必要」フラグを立てずに諦めます。失敗タイムアウトを超過したというエラーイベントをイベントログに記録し、ビジネスオペレーションから呼び出し元のアイテムにエラーを返します。
以下は、上記のシナリオ通りのサンプル呼び出しからの「証拠」の一部です。
まず、サーバー側(SOAPログから)– 10秒間隔で4つの呼び出し/リクエストを受信し、そのたびにリクエストから8秒後に応答を返しました。
05/31/2016 14:18:45 *********************
Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'
...
</SOAP-ENV:Envelope>
05/31/2016 14:18:53 *********************
Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:18:55 *********************
Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:03 *********************
Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:05 *********************
Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:13 *********************
Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:15 *********************
Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:23 *********************
Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
次は、Ensemble BO/クライアント側から、10秒間隔で4回の試行があり、そのたびに7秒後に応答タイムアウトエラーがログに記録されたことが確認できます。
クライアント側
05/31/2016 14:18:45 *********************
Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:18:52 *********************
Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
05/31/2016 14:18:55 *********************
Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:02 *********************
Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
05/31/2016 14:19:05 *********************
Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:12 *********************
Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
05/31/2016 14:19:15 *********************
Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
...
</SOAP-ENV:Envelope>
05/31/2016 14:19:22 *********************
Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
ERROR #5922: Timed out waiting for response
Ensembleの視覚的なトレースは次のとおりです。
そして、これがイベントログエントリです。
トレースイベントをオンにしたサンプルイベントログ(画像内のテキストを読みやすくするためにズームインする必要がある場合があります)
ここには、上記のシナリオの「内部動作」の一部が表示されています。
ログIDが684番のところでは17:09:16に最初の呼び出しが行われます。
次に、7秒後(09:23)に応答タイムアウトエラー(685番)が発生します。 次に、オペレーションは、エラーをログに記録し(687番)、再試行間隔までさらに3秒間待機することを決定します。10秒の再試行間隔から7秒の応答タイムアウトを引いたもの(688番 - 690番)です。
3秒の待機時間が経過した後(09:26、691番)、2回目の試行が行われます(692番)。これらの試行の結果と後続の動作は4回目の試行(704番)まで同じままです。 4回目の試行が失敗した(09:53、705番)後、失敗タイムアウト(30秒)を超過したため、もう1つの試行は行われません。