2

我一直在按照Adam Bean 的例子做一个计时器,但它不能正常工作。我创建了一个@SingletonEJB,其中的方法用@Schedule. 应用程序部署到wildfly 11。我这里有两个问题。第一个是,我的计时器每秒记录一次,而不是每分钟记录一次。第二个问题是,每次触发时间时,我都会收到一条错误消息。

有人可以给我一个提示,我做错了什么?也许我只是瞎了眼,看不见。

我的课:

import javax.ejb.Schedule;
import javax.ejb.Singleton;
import java.util.logging.Logger;

@Singleton
public class DeviceTrackerCronJob {

    private static final Logger LOG = Logger.getLogger(DeviceTrackerCronJob.class.getName());

    private long counter;

@Schedule(second = "*", minute = "*/1", hour = "*", info = "Every Minute!")
public void execute() {
    LOG.info("### --- FAKING SOME CONTENT " + counter++);
    }
}

我得到的信息是:

12:42:03,025 信息 [de.klemensmorbe.tracking.DeviceTrackerCronJob](EJB 默认 - 1)### --- 伪造某些内容 575 12:42:04,040 错误 [org.jboss.as.ejb3.timer](EJB默认值 - 1) WFLYEJB0020: 为计时器调用超时时出错:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId=web.web.DeviceTrackerCronJob auto-timer?:false persistent?:true timerService=org.jboss.as.ejb3 .timerservice.TimerServiceImpl@c39b6bb initialExpiration=null intervalDuration(毫秒)=0 nextExpiration=2018 年 1 月 3 日星期三 12:42:05 UTC timerState=IN_TIMEOUT info=null]:java.lang.RuntimeException:WFLYEJB0343:无法调用超时方法,因为方法 null 不是 org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout(TimedObjectInvokerImpl.java:83) 在 org.jboss.as.ejb3//org.jboss 的超时方法.as.ejb3.timerservice。TimedObjectInvokerImpl.callTimeout(TimedObjectInvokerImpl.java:109) at org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.CalendarTimerTask.invokeBeanMethod(CalendarTimerTask.java:66) at org.jboss.as.ejb3// org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimerTask.run(TimerTask.java:160) 的 org.jboss.as.ejb3.timerservice.CalendarTimerTask.callTimeout(CalendarTimerTask.java:53)在 org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimerServiceImpl$Task$1.run(TimerServiceImpl.java:1220) 在 org.wildfly.extension.request-controller//org.wildfly.extension .requestcontroller.RequestController$QueuedTask$1.run(RequestController.java:497) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.base/java.util.concurrent.ThreadPoolExecutor$工人。在 org.jboss.threads//org.jboss.threads.JBossThread.run(JBossThread.java:320) 的 java.base/java.lang.Thread.run(Thread.java:844) 运行(ThreadPoolExecutor.java:641) )

12:42:04,041 INFO [org.jboss.as.ejb3.timer](EJB 默认值 - 1)WFLYEJB0021:计时器:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId=web.web.DeviceTrackerCronJob 自动计时器? :false persistent?:true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@c39b6bb initialExpiration=null intervalDuration(in milli sec)=0 nextExpiration=Wed Jan 03 12:42:05 UTC 2018 timerState=IN_TIMEOUT info=null ] 将重试 12:42:04,041 INFO [org.jboss.as.ejb3.timer](EJB 默认 - 1)WFLYEJB0023:重试计时器超时:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId=web。 web.DeviceTrackerCronJob auto-timer?:false persistent?:true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@c39b6bb initialExpiration=null intervalDuration(in milli sec)=0 nextExpiration=Wed Jan 03 12:42:05 UTC 2018 timerState=IN_TIMEOUT info=null] 12:42:04,042 错误 [org.jboss.as.ejb3.timer](EJB 默认值 - 1)WFLYEJB0022:重试计时器超时期间出错:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId=web.web.DeviceTrackerCronJob 自动计时器?:false persistent?:true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@c39b6bb initialExpiration=null intervalDuration(in milli sec)=0 nextExpiration=2018 年 1 月 3 日星期三 12:42:05 UTC timerState=RETRY_TIMEOUT info= null]:java.lang.RuntimeException:WFLYEJB0343:无法调用超时方法,因为方法 null 不是 org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout 的超时方法(TimedObjectInvokerImpl.java :83) org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout(TimedObjectInvokerImpl.java:109) org.jboss.as.ejb3//org.jboss.as.ejb3 .timerservice.CalendarTimerTask.invokeBeanMethod(CalendarTimerTask.java:66) at org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.CalendarTimerTask.callTimeout(CalendarTimerTask.java:53) at org.jboss.as.ejb3 //org.jboss.as.ejb3.timerservice.TimerTask.retryTimeout(TimerTask.java:234) at org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimerTask.run(TimerTask.java: 168) 在 org.wildfly.extension.request-controller//org.wildfly 的 org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimerServiceImpl$Task$1.run(TimerServiceImpl.java:1220) .extension.requestcontroller.RequestController$QueuedTask$1.run(RequestController.java:497) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.base/java.util.concurrent。线程池执行器$Worker。在 org.jboss.threads//org.jboss.threads.JBossThread.run(JBossThread.java:320) 的 java.base/java.lang.Thread.run(Thread.java:844) 运行(ThreadPoolExecutor.java:641) )

4

2 回答 2

2

我的计时器每秒记录一次,而不是每分钟。

然后将秒设置为分钟的秒,它应该运行。如果您希望它在 12:00:00 和 12:01:00(即每分钟的第 0 秒)运行,则使用second = "0".

您可能还希望将 persistent 设置为 false,除非您希望服务器在某个时间点关闭时赶上错过的计划。

我不确定您为什么会收到超时错误。

于 2018-01-03T13:02:59.637 回答
1

感谢您的建议。我修复了计时器并习惯了带锁的 EJB。问题是(我认为),计时器不会等待其他计时器完成。我的代码现在看起来像这个例子(3. Schedule Task with a Fixed Delay)。

于 2018-01-05T14:33:02.227 回答