2016-07-08 481 views
0

我有一個這樣的類:辛格爾頓與集羣

@Singleton 
public class RecoveryWorker { 
    @Schedule(minute = "*/1", hour = "*", persistent = false) 
    public void run() { 
     // heavy db queries ~ 2sec 
     ... 
    } 
    ... 
} 

有哪個有這個單,並與同一個Oracle DB

有時候我有錯誤的原理2個wildfly實例:

RROR [org.jboss.as.ejb3] (EJB default - 10) JBAS014120: Error invoking timeout for timer: [id=66ed65c4-3a2d-4343-870d-5f7a46a7742c timedObjectId=com.package.Worker auto-timer?:true persistent?:false [email protected]950e6 initialExpiration=null intervalDuration(in milli sec)=0 nextExpiration=Wed Jun 15 00:01:00 CEST 2016 timerState=IN_TIMEOUT info=null: javax.ejb.ConcurrentAccessTimeoutException: JBAS014373: EJB 3.1 PFD2 4.8.5.5.1 concurrent access timeout on [email protected] - could not obtain lock within 5000MILLISECONDS

我想知道這個塊是怎麼發生的(Oracle有機械阻塞表或其他東西?)在一個時間內在幾個實例中運行一個單例的最佳實踐是什麼?

+0

看看http://stackoverflow.com/questions/27952769/clustered-singleton-using-wildfly和https://docs.jboss.org/author/display/WFLY10/HA+Singleton+Features,如果你正在使用Wildfly 10 –

回答

0

@Singleton只是JVM的單例,不能保證它一次只能在一個實例上運行。

JBAS014120是因爲@Singleton合約,您的計時器是每分鐘。在你的情況下,我想有時候「重型數據庫查詢」可以運行更長時間,而另一個單例將會啓動,因爲你沒有將鎖權限設置爲READ,每個對單例的調用都將被合同阻止。

如果你需要一個集羣單身人士,你應該檢查快速入門。 我已經寫了cluster-ha-singleton,這是你的用例的例子。 https://github.com/wildfly/quickstart 它將選擇一個節點並僅在其中一個羣集節點上啓動調度,如果節點崩潰,它將進行故障轉移。