我有一个单例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中调用方法)
答案 0 :(得分:0)
您必须创建两个单例类,一个包含method1,另一个包含method2。当前正在发生的事情是,当客户端正在执行say method1时,单例的所有方法都被锁定用于其他客户端,因为方法的默认锁定类型是LockType.WRITE。由于您不希望并行执行相同的方法,因此必须使用此锁类型,但这将锁定单例的所有方法以进行并发访问。 Oracle's documentation说:
如果一个方法是锁定类型WRITE,则客户端访问所有 单例的方法被阻止,直到当前客户端完成它 方法调用或访问超时发生