2

次のプロジェクトがあります。

Spring(3.2) ベースの Web アプリケーション (Tomcat 7)、バックグラウンドでいくつかのタスクがあります。

処理する情報を含むキューがあります。このキューは定期的に更新されます (ただし、空になったときのみ)。

また、このキューとプロセスから定期的にデータをキューに入れるスレッドがいくつかあります。

スケジューリングには、ScheduledExecutorService を使用したいと考えていました。

いくつかの問題\質問があります:

  1. このキューを維持する方法は? 私はそれがグローバルであるべきだと思うので。「ホルダー」クラスで静的にする必要がありますか? これは下手なデザインではないでしょうか?

  2. このキューとすべてのタスクを ScheduledExecutorService で初期化するのに適した場所はどこでしょうか? ServletContextLoadingListener は適切な場所ですか? これをSpringで開始する方法はありますか?

  3. コンシューマ スレッドの数を正確に制御する必要がある場合、複数の ScheduledExecutorService インスタンスを使用する必要がありますか?

  4. この場合、ArrayBlockingQueue は適切でしょうか?

4

1 に答える 1

1
  1. 通常のクラスを使用して、Spring に scope で管理させることができますsingleton
  2. init-methodin spring 構成でBean を構成するかInitializingBean、クラスにインターフェースを実装できます。
  3. のスレッド番号ScheduledExecutorServiceは、コンストラクター引数を介して構成できます。複数のタイプのタスクがあり、それらを別々のスレッド プールで実行する場合は、複数のScheduledExecutorServiceインスタンスを使用できます。ScheduledExecutorServiceただし、すべてのタスクが同じタイプの場合、複数のインスタンスは必要ないと思います。
  4. JDK 内で提供される には、クラスのScheduledThreadPoolExecutor内部作業キューがありjava.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueueます (これは構成できません)。ArrayBlockingQueue をどこに置くのかわかりません。
于 2013-02-25T01:45:13.577 に答える