首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

EJB Timer Service 進階特性實測:週期觸發、持久化、交易語義與重試機制

     編輯:Java 相關知識

EJB 2.1 Timer Service 三大進階特性

  1. 週期性 Timer (Interval Timer):createTimer(firstDate, interval, info) 每隔固定間隔觸發 ejbTimeout,區別於單次 createTimer(duration, info)。
  2. Timer 持久化:伺服器重啟後 Timer 存活,若已超時立即觸發 ejbTimeout。
  3. 交易語義:createTimer、cancel、ejbTimeout 皆參與交易,回滾時自動復原狀態。

實測環境:Apusic 4.0 (支援 EJB 2.1)

測試應用:JSP 激活 Timer → Stateless Session Bean 實作 ejbTimeout 打印日誌。注意:Stateful Session Bean 不支援 Timer Service。

測試結果詳細記錄

1. 單次 Timer - 通過

TimerService ts = sessionContext.getTimerService();
ts.createTimer(20000, null); // 20 秒後觸發

2. 週期 Timer - 通過

ts.createTimer(new Date(firstTime), 20000, null); // 首次觸發時間 + 20 秒間隔

3. 持久化 - 通過

  • 重啟前未超時:啟動後繼續計時。
  • 重啟時已超時:啟動後立即調用 ejbTimeout。
  • 4. createTimer 交易回滾 - 通過

    UserTransaction tx = sessionContext.getUserTransaction();
    tx.begin();
    ts.createTimer(30000, null);
    tx.setRollbackOnly();
    tx.commit(); // Timer 被銷毀,不再觸發

    5. cancel 交易回滾 - 通過

    Timer t = ts.createTimer(30000, null);
    tx.begin();
    t.cancel();
    tx.setRollbackOnly();
    tx.commit(); // Timer 恢復,繼續計時並觸發

    6. ejbTimeout 交易失敗重試 - 通過

    // CMT 屬性 RequiresNew
    public void ejbTimeout(Timer timer) {
        System.out.println("timer expired");
        sessionContext.setRollbackOnly(); // 強制回滾
    }

    容器回滾後 5 秒 重新調用 ejbTimeout (可配置)。Apusic apusic.conf 關鍵參數:

    RedeliveryInterval = 5000  // 重試間隔 (毫秒)
    MaxRedeliveries = 3        // 最大重試次數

    總結與最佳實踐

    • Timer Service 適合定時批次、排程報表、狀態檢查等業務。
    • 交易語義保證排程任務的原子性與可靠性。
    • 重試機制 (Redelivery) 確保關鍵任務不因暫時性失敗而遺漏,需冪等設計。
    • 生產環境需根據業務重要性調整 MaxRedeliveries 與告警監控。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved