我需要以下方面的建议:
我有一个@Scheduled 服务方法,它有几秒钟的固定延迟,它会扫描工作队列并处理适当的工作(如果找到的话)。在同一个服务中,我有一个将工作放入工作队列的方法,我希望此方法在完成后立即触发对队列的扫描(因为我确信扫描仪现在需要做一些工作)为了避免预定开始之前的延迟(因为这可能是几秒钟,而且时间有些关键)。
任务执行和调度子系统的“立即触发”功能将是理想的,它还将在手动启动执行后重置 fixedDelay(因为我不希望我的手动执行与预定的执行冲突)。注意:队列中的工作可以来自外部,因此需要定期扫描。
欢迎任何建议
编辑:队列存储在基于文档的数据库中,因此基于本地队列的解决方案不合适。
我不太满意的解决方案(不太喜欢使用原始线程)会是这样的:
@Service
public class MyProcessingService implements ProcessingService {
Thread worker;
@PostCreate
public void init() {
worker = new Thread() {
boolean ready = false;
private boolean sleep() {
synchronized(this) {
if (ready) {
ready = false;
} else {
try {
wait(2000);
} catch(InterruptedException) {
return false;
}
}
}
return true;
}
public void tickle() {
synchronized(this) {
ready = true;
notify();
}
}
public void run() {
while(!interrupted()) {
if(!sleep()) continue;
scan();
}
}
}
worker.start();
}
@PreDestroy
public void uninit() {
worker.interrup();
}
public void addWork(Work work) {
db.store(work);
worker.tickle();
}
public void scan() {
List<Work> work = db.getMyWork();
for (Work w : work) {
process();
}
}
public void process(Work work) {
// work processing here
}
}