带线程/进程的后台工作?

时间:2011-09-26 03:04:15

标签: multithreading java-ee

使用的技术:EJB 3.1,Java EE 6,GlassFish 3.1。

我需要实现一个每2分钟执行一次的后台作业来检查服务器列表的状态。我已经实现了一个计时器,我的函数updateStatus每两分钟调用一次。

问题是我想使用一个线程来进行更新,因为如果再次触发定时器但我的函数调用没有完成,我想杀死该线程并开始一个新的。

我知道我不能在EJB 3.1中使用线程所以我应该怎么做?我真的不想介绍JMS。

1 个答案:

答案 0 :(得分:1)

您应该只使用和EJB计时器。

当工作完成后,只需让工作重新安排。如果您不希望该作业花费更多时间,那么请监视该过程中的系统时间,并且当它结束时,停止该作业并重新安排它。

您需要管理的另一件事是,如果在服务器关闭时作业正在运行,它将在服务器恢复时自动重启。你最好有一个启动过程来扫描Timer系统中存在的当前作业,如果你的不存在,那么你需要提交一个新的。之后,作业应该自行处理,直到部署(删除现有的Timer作业)。

唯一的另一个问题是,如果作业依赖于在服务器启动时运行的某些初始化代码,则很可能在服务器启动之前该作业将启动。因此,可能需要管理启动竞争条件(或者只是确保作业“快速失败”,然后重新提交)。