我在我的应用程序中使用EJB 3.0 Timers
。
关于EJB Timers的一件事是它们默认是持久性的,这意味着当服务器重新启动时,将自动调用Timers而不再调用它们。
我要求在重启服务器时手动启动这些计时器。为此我知道我们需要更改配置XML中的一些我不确切的属性。
我需要在哪里更改属性以设置 persistent = false 。
我使用的是Weblogic Server。
答案 0 :(得分:0)
在EJB 3.0中,定时器是持久的,并且没有要设置的属性使它们成为非持久性的。 EJB 3.1 TimerConfig带来了影响这种情况的可能性。此外,特定于WebLogic的configuration不提供任何帮助。
答案 1 :(得分:0)
该线程很旧,但是我认为现在的担忧仍然存在。 正如@mikko-maunu所指出的那样,自EJB 3.1以来,有一个属性可以指定EJB持久性,但我认为它的建模有两个职责:
我认为上述概念应该是独立建模的,因此我们可以将EJB计时器存储在数据库中,并且还可以更好地控制在系统重新初始化时对触发错误的触发器的处理方式,即应重新触发或忽略它们。
否则,使用基于EJB Timer的作业模块似乎有些尴尬,其中一些存储在数据库中,而另一些则不存储,只是因为我们不想为计划得太频繁运行的作业重新触发以前错过的触发器例如每小时一次。
我已经注意到,在JBoss 7.1 / Java EE 7中,将日程表信息保存在数据库中可以潜在地支持对集群配置的中央控制,而不是具有非持久性日程表的重复和独立实例。但是,对于每天多次触发的一项工作,附带的影响是,所有最终触发失败的触发器都在系统重新初始化时立即触发。
要在重新启动时更好地控制持久EJB计时器,我们可以在 @PostConstruct 方法中检查计时器的getNextTimeout()
是否已过。如果计时器应忽略触发错误的触发器,则可以使用相同的scheduleExpression取消旧计时器并立即创建一个新计时器,因此仅考虑将来的触发器。这对于计划每天运行多次的计时器来说非常有用。
另一种可能更简单的方法是,在 @Timeout 方法中,检查计时器的下一个执行时间getNextTimeout()
是否在当前日期和时间之前,然后确定是否以前,触发失败的触发器应予以处理或丢弃。
答案 2 :(得分:0)
创建程序化计时器(需要@Timeout方法)
inc
或创建自动计时器:只需使用@Schedule注释方法:
TimerConfig timerConfig = new TimerConfig("some info ...", false);
timerService.createIntervalTimer(3000, 1000, timerConfig);
为此,您需要使用EJB 3.1或更高版本,这意味着您需要Java EE 6(或更高版本)服务器或支持此ejb版本的容器。 对于Weblogic,至少需要 12cR1 版本。
@Schedule(hour = "*", minute = "*", second = "*", persistent = false)
private void myScheduledMethod(Timer timer) {
// ...
}
方法中。希望我能帮上忙。