我有一个调用Singleton EJB的调度EJB。由于某种原因,调度方法在每个调度上执行两次(与从WAR文件和EAR中引用它有关)。为了解决这个问题,我在@Lock
bean中的方法上放了@Singleton
注释,但它仍然会同时执行两次:
@Stateless
public class PaymoTimer {
@EJB
private IPaymoManagerRemote manager;
@Schedule(hour = "10,12,14,16", minute = "41", second = "0", info = "PaymoTimer")
public void timer() throws Exception {
manager.generateEmailReport();
}
}
@LocalBean
@Singleton
public class PaymoManager implements IPaymoManagerRemote {
@Override
@Lock(LockType.WRITE)
public void generateEmailReport() {
System.out.println("generateEmailReport");
String text = getDailySummaryForUser();
System.out.println("done");
}
}
我的控制台打印出以下内容:
12:42:00,008 INFO [stdout] (EJB default - 10) generateEmailReport
12:42:00,009 INFO [stdout] (EJB default - 9) generateEmailReport
12:42:24,027 INFO [stdout] (EJB default - 10) done
12:42:24,323 INFO [stdout] (EJB default - 9) done
查看时间和进程ID很明显,在前一个实例仍在运行时调用该方法。
我是否误解了@Lock
注释的意图?
答案 0 :(得分:1)
我认为,那个计时器和单身人士已被打包到WAR(可能在wildfly中,你基本上不再需要EAR)以及进入EAR。因此他们已经部署并运行了两次。