私はうまくいくパターンを提案します。しかし、まず...私は、おそらく要件が少しの解釈の恩恵かもしれないと示唆したいと思います。実際に何が起こっているのかは、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
はいご理解いただけます。 EJB実装ではWebサービスが公開されています これらの行にはあると思っていましたが、スレッドを生成してスレッドを強制終了しても、EJBコンテナがそれらを制御できないため、EJBにとって悪いことはありません。 ありがとう、 Manglu – Manglu