我的java web应用程序使用spring进行依赖注入(inject),打包在EAR中并部署在Jboss 7中,但没有EJB。该应用程序安装在两台负载平衡机上。我需要安排一个方法每天运行,但该方法不能在两个实例上同时运行。 我尝试使用Spring的Scheduling注释,但问题是,由于存在负载平衡,所以scheduled方法运行了两次(每个集群一次)。 在 Jboss 7 中执行此操作的最佳方法是什么?有人可以帮助我吗?
要安排的方法如下所示。
public synchronized void processor() {
LOGGER.info("start");
//processing logic
LOGGER.info("the end");
}
非常感谢!!!
最佳答案
好吧,考虑到需求:两个或多个应用程序并且它们需要同步,您需要 @Singleton 或 @Stateless EJB,如here所述。 .
通过计时器服务调用它,那么它需要是一个在某个方法上带有 @Timer 的 EJB,如果您在某个方法上使用 @Scheduled 等,那么它将调用该方法
在这种情况下,建议使用单例,否则,您最终可能会运行同一计时器的多个实例。
示例
#Example
private void init()
{
ScheduleExpression Expression = new ScheduleExpression();
#This means twice per hour {0,2,4, ... 22} ~ since it ends on 23h:
expression.second(0).minute(0).hour(*/2).month(*).dayOfWeek(*);
stopTimer();
Timer timer = service.createCalendarTimer(exp);
}
任何其他建议似乎都会增加太多的复杂性。
关于Java - 在 Jboss 中调度任务且无需 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58012131/