这是我的用例。一起使用Spring @Scheduled和@Async
传统系统更新数据库队列表QUEUE。
我希望计划定期作业 - 检查队列 的内容 - 如果有表中的行锁定该行并做了一些工作 - 删除队列中排
如果以前的工作仍在运行,那么将创建一个新线程来完成这项工作。我想配置最大并发线程数。
我使用Spring 3和我目前的解决办法是以下(使用1毫秒的固定利率,以获得线程基本上连续运行)
@Scheduled(fixedRate = 1)
@Async
public void doSchedule() throws InterruptedException {
log.debug("Start schedule");
publishWorker.start();
log.debug("End schedule");
}
<task:executor id="workerExecutor" pool-size="4" />
这创造了4个线程直客做和线程正确分享队列中的工作量。但是,当线程需要很长时间才能完成时,我似乎正在获取内存泄漏。
java.util.concurrent.ThreadPoolExecutor @ 0xe097b8f0 | 80 | 373,410,496 | 89.74%
|- java.util.concurrent.LinkedBlockingQueue @ 0xe097b940 | 48 | 373,410,136 | 89.74%
| |- java.util.concurrent.LinkedBlockingQueue$Node @ 0xe25c9d68
所以
1:我应该使用@Async和@Scheduled在一起吗?
2:如果不是那么我怎么才能用弹簧来达到我的要求?
3:仅当其他线程忙时才能创建新线程?
谢谢大家!
编辑:我觉得作业队列渐渐无限长的......现在,使用
<task:executor id="workerExecutor"
pool-size="1-4"
queue-capacity="10" rejection-policy="DISCARD" />
将报告与结果
这岂不是没有'@ Async'正常工作?无论如何,用'@ Scheduled'注解的方法应该是异步执行的。 – ach
如果你想让“线程连续运行”,那么你应该不会真的在首先使用@Scheduled。它的用途是“预定”的活动,而不是连续的活动...... – JoeG
你可能会考虑制作publishWorker.start();方法异步。 –