使用的技术:EJB 3.1,Java EE 6,GlassFish 3.1。
我需要实现一个每2分钟执行一次的后台作业来检查服务器列表的状态。我已经实现了一个计时器,我的函数updateStatus每两分钟调用一次。
问题是我想使用一个线程来进行更新,因为如果再次触发定时器但我的函数调用没有完成,我想杀死该线程并开始一个新的。
我知道我不能在EJB 3.1中使用线程所以我应该怎么做?我真的不想介绍JMS。
答案 0 :(得分:1)
您应该只使用和EJB计时器。
当工作完成后,只需让工作重新安排。如果您不希望该作业花费更多时间,那么请监视该过程中的系统时间,并且当它结束时,停止该作业并重新安排它。
您需要管理的另一件事是,如果在服务器关闭时作业正在运行,它将在服务器恢复时自动重启。你最好有一个启动过程来扫描Timer系统中存在的当前作业,如果你的不存在,那么你需要提交一个新的。之后,作业应该自行处理,直到部署(删除现有的Timer作业)。
唯一的另一个问题是,如果作业依赖于在服务器启动时运行的某些初始化代码,则很可能在服务器启动之前该作业将启动。因此,可能需要管理启动竞争条件(或者只是确保作业“快速失败”,然后重新提交)。