我有下一个项目:
基于Spring(3.2)的Web应用程序(Tomcat7),在后台我有几个任务。
我有一个队列,里面有一些信息要处理。这个队列会定期更新(但只是在它为空的时候)。
此外,我有几个线程定期将来自该队列和进程的数据排入队列。
对于日程安排,我想使用ScheduledExecutiorService。
我有几个问题:
-
如何保持此队列?我认为它应该是全球性的。我应该在某个"holder"类中将其设置为静态吗?这不是一个糟糕的设计吗?
-
用ScheduledExecutiorService初始化此队列和所有任务的好地方在哪里?ServletContextLoadingListener是一个好地方吗?有什么方法可以用Spring初始化它吗?
-
如果我需要精确控制使用者线程的数量,我应该使用几个ScheduledExecutitorService实例吗?
-
ArrayBlockingQueue适用于这种情况吗?
- 您可以使用一个普通类,并让spring使用作用域
singleton
来管理它 - 您可以在spring配置中使用
init-method
配置bean,也可以在类中实现InitializingBean
接口 ScheduledExecutorService
的线程号可以通过构造函数参数进行配置。如果您有多种类型的任务,并且希望在单独的线程池中运行它们,则可以使用多个ScheduledExecutorService
实例。但是,如果您的所有任务都是同一类型的,我认为不需要多个ScheduledExecutorService
实例- JDK中提供的
ScheduledThreadPoolExecutor
有一个java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueue
类的内部工作队列(它是不可配置的)。我不确定你把ArrayBlockingQueue放在哪里