2014-03-27 19 views
1

我有一个单身豆基本上是这样的:运行不同@计划的方法并行的一个@辛格尔顿豆

@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 
    } 
} 

当方法1运行我不想方法1再次调用(在平行下)。这就是为什么我使用单身豆。这按预期工作。但是我注意到method2在method1运行时不会被调用。即使method1运行很长时间,我也想让method2运行。

(该方法被调用不同单豆方法)

+1

你的意思它如预期的那样工作,如果你在不同的Singleton bean中有这两个方法? – Jay

+0

不,这只是描述这些方法中的实际代码做什么来解释他们在其他bean中不使用相同的单例方法。 – user208370

回答

0

您必须创建两个单班,一个包含方法1和另一种含方法2。目前发生的事情是,当一个客户端执行say方法1时,单例的所有方法都被其他客户端锁定,因为这些方法的默认锁类型是LockType.WRITE。既然你不希望同时执行同一个方法,你必须使用这个锁类型,但是这会锁定单例的所有方法以进行并发访问。 Oracle's documentation说:

如果一个方法是锁定类写入,客户端访问所有 单的方法被阻塞,直到当前客户端完成其 方法调用或访问超时