wildfly 10 final:调用计时器超时时出错

时间:2017-03-20 11:00:56

标签: timer timeout wildfly

我有

@Stateless
public class TimerMonitoraggioDatabase {

    @Schedule(hour="5", minute="10", dayOfWeek="Mon-Fri",
      dayOfMonth="*", month="*", year="*", info="MyTimer", persistent=false)
    private void scheduledTimeout(final Timer t) {

但是如果活动超过10分钟,我有这个错误(第一个问题):

  

2017-03-20 05:20:51,097 WARN [com.arjuna.ats.arjuna](EJB默认 -   1)ARJUNA012077:Abort呼吁已经中止原子动作   0:ffff0a93a0e9:-c2465a:58cbcab4:37e3 2017-03-20 05:20:51,099错误   [org.jboss.as.ejb3.timer](EJB默认值 - 1)WFLYEJB0020:错误   调用计时器超时:[id = e2ecbbbf-f339-431d-a031-4f02ea8f67fb   timedObjectId =乌托邦-ear.Utopia-ejb.TimerMonitoraggioDatabase   自动定时器?:真正的持久性?:false   timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@188c2824   initialExpiration = null intervalDuration(以毫秒为单位)= 0   nextExpiration = Tue Mar 21 05:10:00 CET 2017 timerState = IN_TIMEOUT   info = MyTimer]:javax.ejb.EJBTransactionRolledbackException:   交易回滚           at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleEndTransactionException(CMTTxInterceptor.java:137)           在org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:117)

然后再次启动计时器(第二个问题?),而不是在10分钟结束时抛出这个问题

1 个答案:

答案 0 :(得分:0)

我确实遇到过与Wildfly 10相同的问题。

由于@Schedule只是一种使用@Timeout方法打包隐式EJB Timer的简便方法,因此所有其他EJB Timer限制都适用。

我不是EJB专家,但似乎有一个默认超时,当@Schedule方法预计完成时 - 这似乎很短(即仅仅几分钟)。 另外 - 从经验证据 - 看起来如果达到了timout,它会尝试再次触发该方法(因此在第一次终止后第二次运行)。

我读到你可以直接在JBoss中配置默认​​超时,但这对我来说不是一个选择 - 所以我没有说服这个导致(JBoss transaction timeout setting?)。

我所做的是手动设置@Schedule方法的超时。 由于Wildfly 10使用EJB3作为默认值,因此请确保使用TransactionTimeout注释的EJB3版本。

如果尚未隐式,请将以下内容添加到您的pom.xml:

<dependency>
    <groupId>org.jboss.ejb3</groupId>
    <artifactId>jboss-ejb3-ext-api</artifactId>
    <version>2.2.0.Final</version>
    <scope>provided</scope>
</dependency>

现在您可以为@Schedule方法设置一个时间,例如:

import org.jboss.ejb3.annotation.TransactionTimeout:

@Schedule(hour="5", minute="10", dayOfWeek="Mon-Fri",
      dayOfMonth="*", month="*", year="*", info="MyTimer", persistent=false)
@TransactionTimeout(value = 23, unit = TimeUnit.HOURS)
private void scheduledTimeout(final Timer t) {