程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> EJB Timer Service的高級特性心得分享

EJB Timer Service的高級特性心得分享

編輯:關於JAVA

先了解一下這幾個特性,他們是:

1)設定時間間隔後能重復定時的Timer

在EJB 2.1規范中定義的Timer有兩種,一種是single-event timers,另一種是interval timers。single-event timers在它的生命周期中只產生一次timeout,而interval timers可以在每經過一段時間間隔後產生一次timeout。

2)Timer的持久性

如果服務器被關機,那麼這些timer仍然起作用,等到下次服務器啟動時能夠繼續計時。假如啟動時已經超時,那麼立即產生timeout。

3)事務特性

Timer的創建(create)、取消(cancel),以及EJB的ejbTimeout方法都可以參與事務,作為事務的一部分,他們可以在事務回滾(Rollback)時恢復狀態。

也就是說,如果在事務中調用TimerService的createTimer方法,那麼回滾時將銷毀創建的Timer;如果在事務中調用了Timer的cancel方法,那麼回滾時將恢復這個Timer。

如果因為ejbTimeout方法運行失敗導致事務回滾,那麼規范要求服務器的Timer Service在之後要至少再次調用ejbTimeout方法一次。之所以要求這樣做的原因呢,我想可能是因為那些需要定時完成的業務都是相對比較重要的,如果Rollback後不加以處理可能會產生嚴重後果。

好了,現在開始我們的試驗。不過對於timer service的基礎知識,以及如何寫一個使用timer service的EJB,我這裡就不作詳細介紹了,有需要的話可以看看以下的文章。http://sammi_tea.mblogger.cn/posts/10373.ASPx

一、准備

因為Timer服務是EJB 2.1的特性,需要一個實現了EJB 2.1的服務器,我就下載了Apusic 4.0來測試。

下載地址:http://www.apusic.com

二、試驗方案

對於上述的特性,我打算在同一個應用中測試,這個應用很簡單,客戶訪問一個JSP頁面,激活 Timer,這個Timer在超時後會調用一個stateless session bean的ejbTimeout方法,此時我們就在後台打印出調試信息。

需要說明的是,Stateful session bean 中不可以使用Timer Service,其他類型的EJB都可以。

三、試驗結果

1)對於最常用的single-event timers,試驗結果是正常的,服務器可以在計時超時的時候調用ejbTimeout方法。創建這種Timer的代碼片斷如下:

public String getHello(){

TimerService ts = sessionContext.getTimerService();

ts.createTimer(20000, null); //計時20秒

}

2)對於interval timers類型,試驗結果也是正常的,服務器可以在每次間隔時間超時的時候調用ejbTimeout方法。創建這種Timer的代碼片斷如下:

public String getHello(){

TimerService ts = sessionContext.getTimerService();

ts.createTimer(new Date(第一次超時時間), 20000, null);

}

3)對於Timer的持久性,我采用重啟服務器的方法,當服務器重新啟動後,如果時間還沒有超時,服務器會繼續計時,這一點是正確的;另一種情況下,如果啟動後時間已經超時,服務器會在啟動後立即調用ejbTimeout,試驗通過。

4)針對三個方法的事務特性,我分別寫代碼來測試。首先,單獨將createTimer方法包含在一個UserTransaction事務中,並在運行中將事務rollback。試驗中,服務器將事務回滾,之後Timer不再起作用,沒有調用ejbTimeout方法。代碼如下:

public String getHello(){

UserTransaction tx = sessionContext.getUserTransaction();

tx.begin();

ts.createTimer(30000, null);

tx.setRollbackOnly();

tx.commit();

}

5)對於cancel方法的事務特性,和上面的過程類似,將Timer.cancel()包含在一個事務中,並在運行過程中將事務rollback。試驗中,服務器將事務回滾,之後Timer可以繼續計時,並調用ejbTimeout方法。代碼如下:

public String getHello(){

Timer at = ts.createTimer(30000, null);

UserTransaction tx = sessionContext.getUserTransaction();

tx.begin();

at.cancel();

tx.setRollbackOnly();

tx.commit();}

}

6)對於ejbTimeout方法的事務特性,試驗時我把這個方法的CMT屬性設置為RequiresNew,同時在此方法中模擬失敗後調用rollback的情況,首先服務器把事務回滾,然後在5秒後再次調用ejbTimeout方法,完全和規范描述的一樣。實際上這個5秒的時間是可以自己配置的,在apusic.conf文件中,有EJBTimerService的配置,內容如下:

其中的RedeliveryInterval指的就是重新調用ejbTimeout的等待時間。而另一項MaxRedeliverIEs屬性指的是重新調用的次數。

我測試的代碼如下:

public void ejbTimeout(Timer timer){

System.out.println("timer expired");

sessionContext.setRollbackOnly();

}

四、結束語

EJB 2.1中新增的EJB Timer Service功能雖然簡單,但是它的一些高級特性卻很實用,遺憾的是大家還沒有注意到這些特性,我在這裡拋磚引玉,做一個小小的測試,希望能對哪些對Timer服務感興趣的人有幫助。以上所有特性都只在Apusic 4.0上進行了試驗,全部通過測試。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved