createTimer(firstDate, interval, info) 每隔固定間隔觸發 ejbTimeout,區別於單次 createTimer(duration, info)。ejbTimeout。createTimer、cancel、ejbTimeout 皆參與交易,回滾時自動復原狀態。測試應用:JSP 激活 Timer → Stateless Session Bean 實作 ejbTimeout 打印日誌。注意:Stateful Session Bean 不支援 Timer Service。
TimerService ts = sessionContext.getTimerService();
ts.createTimer(20000, null); // 20 秒後觸發
ts.createTimer(new Date(firstTime), 20000, null); // 首次觸發時間 + 20 秒間隔
ejbTimeout。UserTransaction tx = sessionContext.getUserTransaction();
tx.begin();
ts.createTimer(30000, null);
tx.setRollbackOnly();
tx.commit(); // Timer 被銷毀,不再觸發
Timer t = ts.createTimer(30000, null);
tx.begin();
t.cancel();
tx.setRollbackOnly();
tx.commit(); // Timer 恢復,繼續計時並觸發
// CMT 屬性 RequiresNew
public void ejbTimeout(Timer timer) {
System.out.println("timer expired");
sessionContext.setRollbackOnly(); // 強制回滾
}
容器回滾後 5 秒 重新調用 ejbTimeout (可配置)。Apusic apusic.conf 關鍵參數:
RedeliveryInterval = 5000 // 重試間隔 (毫秒)
MaxRedeliveries = 3 // 最大重試次數
MaxRedeliveries 與告警監控。