在一个@ Singleton-bean中并行运行不同的@ Schedule-methods

时间:2014-03-27 08:46:26

标签: java java-ee ejb

我有一个单例bean,基本上是这样的:

@Singleton
public class Timer {

    @Schedule(minute="*/3", hour="*")
    public void method1() {
        // Task may take 10 minutes sometimes
    }

    @Schedule(minute="*", hour="*")
    public void method2() {
        // This should run even though method1 is running
    }
}

当method1运行时,我不希望再次调用method1(并行)。这就是我使用单身豆的原因。这按预期工作。但我注意到,当method1运行时,方法2没有被调用。我希望method2能够运行,即使method1正在运行很长时间。

(方法是在不同的单例bean中调用方法)

1 个答案:

答案 0 :(得分:0)

您必须创建两个单例类,一个包含method1,另一个包含method2。当前正在发生的事情是,当客户端正在执行say method1时,单例的所有方法都被锁定用于其他客户端,因为方法的默认锁定类型是LockType.WRITE。由于您不希望并行执行相同的方法,因此必须使用此锁类型,但这将锁定单例的所有方法以进行并发访问。 Oracle's documentation说:

  

如果一个方法是锁定类型WRITE,则客户端访问所有   单例的方法被阻止,直到当前客户端完成它   方法调用或访问超时发生