簡體   English   中英

EJB計時器忽略TransactionTimeout

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM