EJB @Lock没有按预期工作

时间:2014-10-24 10:45:36

标签: java java-ee ejb

我有一个调用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注释的意图?

1 个答案:

答案 0 :(得分:1)

我认为,那个计时器和单身人士已被打包到WAR(可能在wildfly中,你基本上不再需要EAR)以及进入EAR。因此他们已经部署并运行了两次。