[英]EJB timer ignores TransactionTimeout
我有個EJB計時器,部署在JBoss 6.4上。 在99%的所有情況下,計時器都可以正常工作,但是有時它可能需要很長時間才能完成,並拋出PersistenceException: Transaction was rolled back in a different thread!
。
我發現這是由於Transacion超時值太低所致。 我不想編輯默認值,而是要覆蓋特定於方法的超時。 為了解決這個問題,我將功能分為兩種方法:一種是用@Timeout
注釋的方法, @Timeout
一種是實際起作用的方法。
這是我的計時器實現:
@Singleton
public class MyTimer implements SomeTimerInterface {
@EJB
private SomeManager myManager;
@Resource
private TimerService timerService;
private Timer timer;
@Override
public void startTimer() {
// Timer scheduled to fire every 7th minute
ScheduleExpression schedule = new ScheduleExpression();
schedule = schedule.hour("*").minute("*/7").second("00");
TimerConfig config = new TimerConfig();
config.setPersistent(false);
timer = timerService.createCalendarTimer(schedule, config);
}
@Timeout
@AccessTimeout(value = 20, unit = TimeUnit.MINUTES)
public void handleTimeout() {
workInNewThread();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@TransactionTimeout(unit = TimeUnit.SECONDS, value = 900)
public void workInNewThread() {
// This can take anything from 1 sec to 15 min.
List<Object> objects = myManager.getAllTheDatabaseObjects();
}
}
但是,計時器似乎忽略了TransactionTimeout,因為它在5分鍾(默認值)后仍然超時。 如何覆蓋默認超時以確保計時器完成作業?
不知道我是否正確。 從您的代碼看來,您好像從@Timeout方法調用workInNewThread(),但是有一個帶有Tx屬性的方法cleanup()。
我猜您從@Timeout在同一個bean中調用方法。 但是在這種情況下,@ TxAttribute和TxTimeout注釋都不會生效,因為容器無法控制內部方法的調用。 您需要使用其他EJB或自引用來讓控制器執行此工作。 另一種選擇是直接注釋超時方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.