为什么这个简单的调度程序不起作用?

Why this simple scheduler does not work?

我做错了什么吗?

import java.util.Date;
import java.util.Timer;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.TimerService;

@Singleton
@LocalBean
@Startup
public class CIScheduler {

    @Resource
    private TimerService timerService;

    @PostConstruct
    public void init() {
        timerService.createTimer(1000, 5000, "myTimerInterval");
    }

    @Timeout
    public void execute(Timer timer) {
        System.out.println("Current Time : " + new Date());
    }
}

堆栈:JDK 8,Wildfly 10

错误日志:

09:31:31,781 WARN [org.jboss.as.ejb3] (EJB default - 9) WFLYEJB0161: Failed to reinstate timer 'config-api.config-api.CIScheduler' (id=f571b03a-efa 9-467d-a9de-b17d88bf54c7) from its persistent state 09:31:31,783 ERROR [org.jboss.as.ejb3] (EJB default - 9) WFLYEJB0022: Error duri ng retrying timeout for timer: [id=35f55f82-a982-43d8-bece-42cfc89debe8 timedObj ectId=config-api.config-api.CIScheduler auto-timer?:false persistent ?:true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@1eef0fd init ialExpiration=Wed Jun 15 09:20:46 BRT 2016 intervalDuration(in milli sec)=5000 n extExpiration=Wed Jun 15 09:31:36 BRT 2016 timerState=RETRY_TIMEOUT info=myTimer Interval]: javax.ejb.EJBException: java.lang.IllegalArgumentException: ja va.lang.ClassCastException@1da01b2

样本提取自:https://examples.javacodegeeks.com/enterprise-java/ejb3/timer/ejb-timer-service-example/

更新: 我清理了数据和 tmp 文件夹,错误日志更改为:

09:49:42,178 INFO [org.jboss.as.ejb3] (EJB default - 2) WFLYEJB0021: Timer: [id =26b74afb-625d-4007-a786-1c0caa92a70b timedObjectId=configuracao-api.config-api.CIScheduler auto-timer?:false persistent?:true timerService=org.jboss.as.e jb3.timerservice.TimerServiceImpl@1b701e2 initialExpiration=Wed Jun 15 09:49:37 BRT 2016 intervalDuration(in milli sec)=5000 nextExpiration=Wed Jun 15 09:49:47 BRT 2016 timerState=IN_TIMEOUT info=myTimerInterval] will be retried 09:49:42,179 INFO [org.jboss.as.ejb3] (EJB default - 2) WFLYEJB0023: Retrying t imeout for timer: [id=26b74afb-625d-4007-a786-1c0caa92a70b timedObjectId=config-api.config-api.CIScheduler auto-timer?:false persistent?:true timerS ervice=org.jboss.as.ejb3.timerservice.TimerServiceImpl@1b701e2 initialExpiration =Wed Jun 15 09:49:37 BRT 2016 intervalDuration(in milli sec)=5000 nextExpiration =Wed Jun 15 09:49:47 BRT 2016 timerState=IN_TIMEOUT info=myTimerInterval] 09:49:42,181 ERROR [org.jboss.as.ejb3] (EJB default - 2) WFLYEJB0022: Error duri ng retrying timeout for timer: [id=26b74afb-625d-4007-a786-1c0caa92a70b timedObj ectId=config-api.config-api.CIScheduler auto-timer?:false persistent ?:true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@1b701e2 init ialExpiration=Wed Jun 15 09:49:37 BRT 2016 intervalDuration(in milli sec)=5000 n extExpiration=Wed Jun 15 09:49:47 BRT 2016 timerState=RETRY_TIMEOUT info=myTimer Interval]: javax.ejb.EJBException: java.lang.IllegalArgumentException: argument type mismatch at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInt erceptor.java:187) .......

@Timeout注解的方法只允许有javax.ejb.Timer类型的参数。您无意中从 util 包 (java.util.Timer) 中导入了 Timer。如果您修复了导入,计时器应该会像一个魅力:)。

要解决该问题,您必须执行以下步骤:

  1. 使用 @Schedule
  2. 取消部署具有定时器服务的 war 或 jar 或 ear
  3. 在您的 Wildfly 服务器上转到此路径:wildfly-13.0.0.Final/standalone/data/timer-service-data/ 并删除您的内容,如下所示:eSocialWeb-1.0-SNAPSHOT.eSocialWeb-1.0-SNAPSHOT.ESocialTimer.

  4. 再次部署您的 war 或罐子或耳朵并微笑!

因此,您再也不会看到此消息,除非您更改计时器中的内容 @Schedule:

[org.jboss.as.ejb3.timer] (ServerService Thread Pool -- 92) WFLYEJB0161: Failed to reinstate timer 'eSocialWeb-1.0-SNAPSHOT.eSocialWeb-1.0-SNAPSHOT.ESocialTimer'