我有一个spring应用程序,它使用org.springframework.scheduling.quartz.SimpleTriggerBean
来定期执行方法。
有时,我想“按需”调用相同的方法。它将由GUI上的操作触发。由于我想要执行的方法需要几秒钟,因此我不想在执行完成之前阻止用户GUI。此外,我想用后台线程协调“按需”执行(互斥)。
这是一种方法:
我正在寻找更聪明/更清洁的解决方案。
答案 0 :(得分:3)
如果您使用Spring 3.0,请查看参考文档的Task Execution and Scheduling部分。
它显示有两个注释:
@Scheduled
@Timer
灵魂至少是相同的:有三种方法:
private void doIt() {...}
@Scheduled(cron="0 0 0 * * MON-FRI")
public void doItEveryDay() {doIt();}
@Async
public void doItOnDemand() {doIt();}
但是通过这个注释,很容易理解为什么有三种方法。
答案 1 :(得分:1)
您可以使用SingleThreadExecutor
。
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.submit(<task>);
当您的石英作业触发时,它可以向执行者提交任务。同样,当您的作业手动运行时,它也可以向执行程序提交任务。由于ExecutorService只有一个线程,因此该任务一次只能运行一次。任务的另一个实例将排队,直到当前正在运行的任务完成。在这种情况下,您无需担心手动同步。