2012-03-16 66 views
2

我有一個關於安全和以下假設定時服務的正確性幾個問題:EJB自動定時器,鎖定,超時和長時間運行的方法

@Singleton 
public class MyTimerService { 

    @Schedule(second = "*", minute = "*", hour = "*", persistent = false) 
    public void checkTakingOneMinute() { 
    // code below takes a minute or so 
    } 
} 

所有我想在這裏做的,是儘快檢查一番可能的(在這種情況下每秒)。據我瞭解,方法checkTakingOneMinute()將不會開始新的檢查,直到它完成前面的調用。這就是我想要的,但是我擔心容器的內部:方法執行會在忙時被忽略,或者它會被鎖定並放入一個隊列中,並隨後出現鎖定超時?

回答

3

EJB規範要求容器計劃「趕上」計時器事件,如果計時器無法觸發定時器,因爲它已經在運行。實際上,容器可能會重新計算方法結束後的下一次着火時間,如果下一次着火時間在當前時間之前,立即重新執行。我知道這是WebSphere Application Server的工作原理。

請注意,bean的默認ConcurrencyManagement(ConcurrencyManagemementType.CONTAINER)和定時器方法的Lock(LockType.WRITE)將阻止執行任何其他方法。如果你需要其他的方法,你可以考慮使用ConcurrencyManagementType.BEAN

+0

看起來像我的問題是幾乎相同http://stackoverflow.com/questions/2691835/timer-service-in-ejb-3-1-schedule-calling-timeout-problem,代碼重寫,你的解決方案效果很好,謝謝。 – Osw 2012-03-17 11:02:52

+0

你可能是對的。我傾向於編寫個性化/自定義的答案,而不是尋找雙關(甚至是我回答並忘記的雙關語!)。 – 2012-03-18 23:42:48

1

我們在我們的應用程序中使用了定時器,但在Weblogic中使用了定時器。據我所知,如果計時器線程正在忙於處理下一個計劃時喚醒的進程,則喚醒進程將等待下一個計劃重新執行,但可以根據某些參數進行控制。我發現了一些關於如何在Websphere中完成的文檔(我不確定這些可配置參數是用於Websphere的) - 可能這個鏈接有助於澄清你的疑惑。在那裏他們提到了錯過的定時器(重試和錯過的超時部分),這是你所關心的。

EJB timers in Websphere

+0

好文章,謝謝。您可能也對@bkail解決方案感興趣,請參閱他的回答下的評論。 – Osw 2012-03-17 11:05:36