2009-05-14 19 views
2

Webサービスを呼び出していて、5秒以内に応答します。 5秒(ネットワークレイテンシを無視して)で処理できない場合は、トランザクションをロールバックしてタイムアウト例外を送信します。Webサービス - 実装側のタイムアウト

タイムアウトは、発信側クライアントのコードでのみ設定できます。私はこれをWebサービス実装者(サーバー側)が実施するようにしたい。私はこれを行う方法を見つけることができないようです。

タイムアウトをクライアント側で指定すると、サーバーはトランザクションを完了して完了する可能性があります。サーバーが要求の処理を終了する前に、元の要求が成功したかどうか、またはエラーが発生したかどうかはわかりません。

私は、Javaクライアントを使用して、EJBによって実装されたWSと対話しています。 入力があれば分かります。

おかげで、 Manglu

答えて

0

私は右のあなたを取得する場合、EJBがサービスを実装し、それが5秒以内に応答するか、トランザクションをロールバックし、タイムアウト応答を送信しなければなりません。とにかくステートフルBeanが必要なように見えます。なぜなら、各サービスコールの時間を個別にトラッキングしたいからです。

サービスコールごとにEJBから「kill」スレッドを開始します。スレッドは5秒間待機し、その期間の後にEJBに通知します。ロールバックする必要があり、エラーメッセージで応答します。 EJBは(通常の)ケースのためにkillスレッドを終了することができ、期待された時間枠内で応答することができます。

+0

はいご理解いただけます。 EJB実装ではWebサービスが公開されています これらの行にはあると思っていましたが、スレッドを生成してスレッドを強制終了しても、EJBコンテナがそれらを制御できないため、EJBにとって悪いことはありません。 ありがとう、 Manglu – Manglu

0

ほとんどのJ2EEアプリケーションサーバーでは最大トランザクション時間を設定でき、その時間を超えるとロールバックされると思います。呼び出し元にうまく対応したいので、トランザクションの「肉」をBean Aに入れ、SOAP処理のBean Bを置くことを検討するとよいでしょう。つまり、Bean BではRollbackExceptionが発生します。タイムアウトのためのサブクラス?)、良い方法で呼び出し元に応答します。

JBoss(およびおそらく他のアプリケーションサーバー?)を使用している場合、明らかにBMTを使用してトランザクションタイムアウトを動的に設定できます。 http://www.jboss.org/community/wiki/TransactionTimeout

+0

こんにちは、 あなたは、移行のタイムアウトを正確に記述しています。 しかし、私は2つのWebサービスがある場合、5秒間のタイムアウトを必要とするものと、10秒間のものを持つものは、J2EE Trnasactionタイムアウトを利用することで自然に動作しません。 ありがとう、 Manglu – Manglu

+0

セッションごとのBean単位でタイムアウトを設定することはできません(Webサービスごとに1つのセッションBeanと仮定します)。私はWeblogicが最近のバージョンでこれを許可したことを思い出します。どのコンテナをターゲットにしていますか? – ShabbyDoo

+0

こんにちは、 マインは、WebSphereベースのアプリケーションです。 Manglu – Manglu

0

私はうまくいくパターンを提案します。しかし、まず...私は、おそらく要件が少しの解釈の恩恵かもしれないと示唆したいと思います。実際に何が起こっているのかは、5秒のタイムアウトが必要で、タイムアウトに達するとそのことが起こらなかったことを非常に確実に確認する必要があります。クライアントがクラッシュしたりネットワークの不具合が発生した場合、その結果が見られる前にどのように動揺したのでしょうか?その場合、クライアント側から何が起こったかを知ることができず、クライアントは取引に参加していないという質問(とほとんど必然的に)。

したがって、異なるモデルのインタラクションは実装が簡単で、かなり信頼性が高い場合があります。そのモデルについて説明し、必要に応じて5秒のタイムアウトを与える方法を説明します。

私が提案する対話のモデルは、「プレース・オーダー、フィル・フォー・フィル・レイト」モデルです。これはオンライン取引システムに使われているものです。クライアントが要求を送信すると、システムは要求をどこかで安全に傍受し、すぐにクライアントに応答します。タイムアウトは必要ありません。次に、ワーカースレッド(Java EE土地やWebSphereのasynch beansでMDBを使用する)では、実際の作業を行うことができます。

クライアントは後で「その注文番号73はどうですか?」と尋ねることができます。または「73をキャンセルしてください」と表示されます。 Ajaxやコールバック技術を使用することで、そのモデルに対して非常に優れたUIを提供できます。

「キャンセル」と言っているクライアントの実装は、通常、あるデータベースによって適切なロックによって仲介される必要があることに注意してください。楽観的ロック、

Update order 73 to cancelled WHERE its state is working 
if the number of rows updated == 0 then "TOO LATE we already filled it" 

のようなものを意味するSQLなステートメントを使用して

は、したがって、充填剤は、その主要な取引で、記録がキャンセルされた場合は、「満たされた」に更新し、取引を中止するに出席することができます。

私たちは、2つの非同期の「スレッド」の間を迂回しました。

多くのシステムでこれで十分です。心の中で

ベア:あなたの労働者は長い時間がかかっている場合

  • 、全体的なthrouputは仕事の終わりに、それをキャンセルすることは、非常に悪いかもしれユーザーがjusyもう一度リクエストを送信します。
  • JDBCの深いところで作業が中断している間は、おそらく中断することはできないので、ここで議論したことで「暴走」クエリは停止しません。

5秒のタイムアウトが必要な場合は、すぐにクライアントに戻り、後でチェックを行うのではなく、スリープ後にキャンセルチェックを行うようにサービスがコード化されている、別の要求。したがって、クライアントコードは次のようになります。

Begin tran 
    stash request 
Commit 

// now the worker may get round to starting the work sometime 

Sleep 5 seconds 

Begin Tran 
    attempt to cancel! 
    // that will fail if the work is completed 
    // the WHERE will not find the record in the right state 
if update worked COMMIT 
    // now worker cannot complete 
else ABORT 

// by here the work is either complete or cancelled 
// even if worker is still running it cannot complete 

return state of record 
関連する問題