我有
@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分钟结束时抛出这个问题
答案 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) {