【发布时间】:2013-01-15 09:29:37
【问题描述】:
这是我的用例。
旧系统更新数据库队列表 QUEUE。
我想要一个定期的定期工作 - 检查 QUEUE 的内容 - 如果表中有行,它会锁定行并做一些工作 - 删除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:如果没有,那我还能如何使用 spring 来实现我的要求?
3:如何在其他线程忙的时候才创建新线程?
谢谢大家!
编辑:我认为工作队列变得无限长......现在使用
<task:executor id="workerExecutor"
pool-size="1-4"
queue-capacity="10" rejection-policy="DISCARD" />
将报告结果
【问题讨论】:
-
没有
@Async就不能正常工作吗?使用@Scheduled注释的方法无论如何都应该异步执行。 -
如果您希望“线程连续运行”,那么您首先不应该真正使用@Scheduled。它用于“预定”活动,而不是连续活动......
-
你可以考虑制作 publishWorker.start();方法异步。
标签: spring memory scheduled-tasks