0

MDBをスケジュールする方法を探しています。私の要件は、MDBが会社からシステムにフィードするように設定されていることです。このシステムは毎晩メンテナンスのために出かけますが、他のシステムはそれを知らず、それを供給しようとし続けるかもしれません。永続キューは、システムがオンラインに戻るまでメッセージがピルされる可能性があるという点で優れています。

どうすればそれを管理できますか?私はすでにそれに遭遇しました:特定の時間にキューにアクセスするようにメッセージ駆動型Beanをスケジュールしますか?ただし、Java 7を使用し、最悪の場合、サーバーが再起動するとメッセージが失われます(メッセージはJMSキューから取り出され、タイマーが処理するまでメモリに保持されます)。

これの別の使用法は、「再試行」キューを実装することです。エラーが発生した場合は、メッセージの処理を再試行しますが、一定の時間が経過した後、すぐには再試行しません。

MDBを一定時間オフラインに保つためのアイデアはありますか?

4

2 に答える 2

0

JBossのほとんどのバージョンは、MDBでの配信を停止できる管理MBeanを公開しています。ただし、EJB3を使用している場合は自動起動するため、MDBのブラックアウト期間中に起動が発生した場合は、起動時にMDBの起動を停止するように起動クラスを登録する必要があります。そのsnafuを過ぎると、配信ウィンドウに応じてMDBを開始および停止する簡単なクォーツジョブをスケジュールできます。

于 2012-08-14T20:00:27.847 に答える
0

まあ、一般的な方法でMDBを一時停止する方法はないようです。最善の解決策は、ほとんどの人が答えるように、DLQ(またはDMQ)を使用することです。

ここで、メッセージにタイマーを導入する場合は、プロデューサーの存続時間をメッセージを待機させたい時間に設定します。次に、それを通常のキューに送信します。たとえば、コンシューマーがないwaitingQueueに送信します。有効期限が切れると、メッセージはデフォルトの宛先に送信されます(Glassfish MQの場合はmq.sys.dmq、mq.sys.dmqをimqDestinationNameとしてjmsリソースを作成してください)。エラーキューをリッスンしているMDBがあり、メッセージを再度送信する責任があります。ここで、しばらくの間キューを「閉じ」たい場合、メッセージがキューに到着したときに、現在の時刻が許可されているかどうかを確認します。存続時間を次の営業時間までの時間に設定し、waitingQueueに送信するだけです。

最初から使用しなかったのは、いくつかの落とし穴に陥ったためです。Glassfish3.1.1およびその組み込みMQでDMQを使用するときに設定するいくつかの便利なプロパティを次に示します。

imq.message.expiration.interval = 1は、タイムアウトしたメッセージをDMQに送信する前の各キューのポーリング間隔です。デフォルトは60秒です。私のように、少しの待ち時間でアプリケーションをテストしたい場合は、これが必要です。

于 2012-08-16T07:43:07.163 に答える