java – Timer正在创建多个计时器实例
这是一个真正简单的问题,我猜,但我无法弄清楚为什么会发生这样的事情.
我有一个EJB计时器的实现,它使用@Singleton注释,即单例计时器. 我每隔5分钟就开始运行一次.代码看起来像这样: @Singleton @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class Scheduler { private static final double timerVar = Math.random() * 33; static Logger logger = Logger.getLogger("Scheduler"); @Schedule(second = "*",minute = "*/5",hour = "*",persistent = true) public void doWork() { logger.log(Level.INFO,"timer value for this session : " + timerVar); } } 当进程运行时,它在1秒的间隙内同时执行10个调度程序实例,即 (EJB default - 1) (EJB default - 2) (EJB default - 3) (EJB default - 4) 等等.当我在代码中放置一个冗长的操作时,(EJB default – 1)不完整,当(EJB default – 2)尝试执行时,它给出了一个错误说:
首先,如何避免一次执行多个EJB调度程序实例? 对于我得到的超时错误,我发现JBOSS队列中有很多票据,如here所述. 编辑 在最新评论中添加了代码,因此它是可读的:
@Resource TimerService timerService; @Schedule(persistent = false,minute = "/30",hour = "") public void checkQueueState() { dt = new DataAccessFactory(); excvo = dt.canExecute(); dt = null; available = excvo.isExecuteReady(); if (available) { timerService.createSingleActionTimer(new Date(),new TimerConfig(null,false)); } } @Timeout private void generateReport(Timer timer) { logger.info("!!--timeout invoked here " + new Date()); } 解决方法
您正在创建持久计时器.因此,在指定的间隔后,它将创建新的&将它们排队,等待前一个完成执行. 我想,在你重新启动之后,所有排队的计时器都有超时的时间.服务器将创建多个实例,因为它们是持久的.
它是单例,默认情况下所有方法都有锁类型写,因此一次只执行一个线程.因此,如你所说,其他人将获得超时异常/无法获得锁定等,这是一个漫长的过程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |