5

db内のレコードが指定された間隔で更新/変更されない場合に、アラートを送信する必要があるという要件があります。たとえば、受け取った発注書が1時間以内に処理されない場合、リマインダーをデリバリーマネージャーに送信する必要があります。

リマインダー/アラートは、正確に間隔(秒を含む)で送信する必要があります。最終変更時刻が13:55:45の場合、アラートは14:55:45にトリガーされます。追跡する必要のある行が数百万になる可能性があります。

単純なアプローチは、カスタムスケジューラを実装することであり、すべてのレコードがそれに登録されます。ただし、データベースをポーリングして1秒ごとに変更を探す必要があり、パフォーマンスの問題が発生します。

アップデート:

もう1つの基本的なアプローチは、レコードごとにスレッドを作成し、それを1時間スリープ状態にすることです(または)タイムアウトのあるキューイングの概念を使用します。しかし、それでもパフォーマンスの問題があります

同じことを実装するためのより良いアプローチについて何か考えはありますか?

4

4 に答える 4

2

おそらく内部JMSキューを使用する方が良い解決策です。たとえば、スケジュールされたメッセージ機能http://docs.jboss.org/hornetq/2.2.2.Final/user-manual/en/html/examples.html#を使用したい場合があります。examples.scheduled- hornetqを使用したメッセージ。

ちょうど1時間後にアラートメッセージを公開するようブローカーに依頼できます。一方、一部の取引アクティビティの処理中に、このメッセージを手動で削除できます。これは、取引アクティビティがエラーなしで処理されたことを意味します。

于 2012-08-01T07:06:19.607 に答える
2

各リマインダーにタイマーを使用します。つまり、最終変更時刻が17:49:45の場合、アラートは18:49:45にトリガーされる必要があります。単に、1時間後に正確に呼び出すタスクごとに動的タイマースケジュールを作成する必要があります。

于 2012-08-01T12:21:18.540 に答える
2

あなたが本当に「リアルタイム性」を主張するならば、それはJavaでは不可能です。Javaでは、ガベージコレクターの世界停止フェーズを奨励することができ、正確な時刻を保証することはできません。

おおよその時間も許容できる場合は、他の回答で提案されているようなスケジュールされたキューを使用し、そうでない場合は、リアルタイムJavaまたはネイティブ呼び出しを使用します。

于 2012-08-08T13:22:36.493 に答える
0

注文が時間の経過とともに入力されていると想定できる場合は、次のようになります。

プロパティと。Queueを持つ要素でを使用できます。time-of-orderorder-id

DBに追加された各新しいエントリも、このにエンキューされますQueue

Queue毎分の開始時に要素を確認できます。

の先頭で要素をチェックするときに、Queueから1時間経過している場合は、DBでtime-of-orderエントリを検索します。order-id

見つかって更新されなかった場合は通知を送信し、そうでない場合はからデキューしQueueます。

于 2012-08-01T11:48:25.987 に答える