TimerService#createTimer 忽略延迟
TimerService#createTimer Ignores Delay
我想使用 Java EE 定时器服务来创建周期性任务。 this one 之类的教程建议这样做:
@Startup
@Singleton
public class AutomaticBean {
@Resource
TimerService timerService;
@PostConstruct
public void initialize() {
this.timerService.createTimer(0, 5000, null);
System.out.println("AutomaticBean.initialize()");
}
@Timeout
public void programmaticTimout(Timer timer) {
System.out.println("AutomaticBean.programmaticTimout()");
}
}
我希望每 5 秒看到一条消息。但是它每隔一秒发送一次。
11:20:13,341 INFO [stdout] (EJB default - 6) AutomaticResendBean.programmaticTimout()
11:20:13,392 INFO [stdout] (EJB default - 5) AutomaticResendBean.programmaticTimout()
11:20:14,340 INFO [stdout] (EJB default - 3) AutomaticResendBean.programmaticTimout()
我不知道为什么那行不通。我也尝试了定时器服务的其他方法。 createSingleActionTimer
也没有用,它还创建了一个周期性计时器(而不是一次执行的计时器)。
问题是什么?容器是 Wildfly 16.
这个问题的答案与实际设置无关,但其他人可能有同样的问题所以这里是:
在默认情况下,JMS 计时器是使用持久的 TimerConfig
创建的。这意味着一旦你创建了一个每秒 运行s 的计时器,即使你重新启动服务器(或删除它的创建),这个计时器也会得到 运行。
事情就是这样。我每秒创建一个计时器。每秒 运行。然后我创建了一个延迟的第二个计时器。由于两者的代码都是 运行,所以我看不出我实际上有两个计时器。
我想使用 Java EE 定时器服务来创建周期性任务。 this one 之类的教程建议这样做:
@Startup
@Singleton
public class AutomaticBean {
@Resource
TimerService timerService;
@PostConstruct
public void initialize() {
this.timerService.createTimer(0, 5000, null);
System.out.println("AutomaticBean.initialize()");
}
@Timeout
public void programmaticTimout(Timer timer) {
System.out.println("AutomaticBean.programmaticTimout()");
}
}
我希望每 5 秒看到一条消息。但是它每隔一秒发送一次。
11:20:13,341 INFO [stdout] (EJB default - 6) AutomaticResendBean.programmaticTimout()
11:20:13,392 INFO [stdout] (EJB default - 5) AutomaticResendBean.programmaticTimout()
11:20:14,340 INFO [stdout] (EJB default - 3) AutomaticResendBean.programmaticTimout()
我不知道为什么那行不通。我也尝试了定时器服务的其他方法。 createSingleActionTimer
也没有用,它还创建了一个周期性计时器(而不是一次执行的计时器)。
问题是什么?容器是 Wildfly 16.
这个问题的答案与实际设置无关,但其他人可能有同样的问题所以这里是:
在默认情况下,JMS 计时器是使用持久的 TimerConfig
创建的。这意味着一旦你创建了一个每秒 运行s 的计时器,即使你重新启动服务器(或删除它的创建),这个计时器也会得到 运行。
事情就是这样。我每秒创建一个计时器。每秒 运行。然后我创建了一个延迟的第二个计时器。由于两者的代码都是 运行,所以我看不出我实际上有两个计时器。