2011-09-13 137 views
0

我想安排一個作業,它讀取一些實體,調用一些ws並寫入/更新一些實體。這項工作應該在月球之後處理,例如在凌晨1點。我對這個問題有兩個問題。首先是調度程序需要不斷的參數,我的要求是調度程序應該可以通過一些UI進行調整。有沒有合適的方法來做到這一點?否則,我必須每30分鐘調整一次調度程序,並且在方法內部,我必須查看一些可變時間值,而不管它們是否滿足。第二個問題是在Scheduler方法內啓動usertransaction,當我調用調用utx.start的方法時,我得到「線程已經與事務關聯!」進出口。我該怎麼辦?建議請。提前致謝。EJB定時器使用建議

回答

0

如果要創建變量計劃表達式,則需要獲取TimerService(例如@Resource Timerservice _timerService),然後使用createCalendarTimer方法,該方法將調用您的@Timeout方法。計時器的時間表是不可變的,所以UI將需要使用getTimers()來查找/取消現有的計時器(可能通過匹配getInfo()),然後再創建一個新計時器。

@Timeout方法繼承了包含Bean的事務功能。如果該bean使用容器管理的事務,則UserTransaction將不起作用。

+0

我按照您的建議解決了創建變量計劃表達式問題。另一方面,我仍然有關於交易問題的問題。我有一個名爲ModelOperations的類,它提供了CRUD操作。我將這個類注入到我的Timer類中,但是當我從ModelOperations中調用該方法時,我得到了「線程已經與事務關聯!」。因爲,我的持久化方法包括utx.begin,commit等調用。您認爲我應該怎麼做,以便重用。非常感謝您的幫助。 –

+0

重構代碼,以便您可以調用僅在沒有UserTransaction.begin/end的情況下執行業務邏輯的方法。 –

0

您可以公開受管Bean以通過JMX控制檯管理此計時器。

對於第二個問題,您似乎配置了要由容器管理的事務。然後,當該方法啓動時,交易將自動啓動。您可以禁用此自動管理,或者更好,避免程序化管理並讓容器管理事務。