2014-03-27 18 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說:

如果一個方法是鎖定類寫入,客戶端訪問所有 單的方法被阻塞,直到當前客戶端完成其 方法調用或訪問超時