Java EJB3计划无法正常工作

Java EJB3计划无法正常工作,java,jakarta-ee,timer,ejb,wildfly-11,Java,Jakarta Ee,Timer,Ejb,Wildfly 11,我一直在按照程序做计时器,但它不能正常工作。我创建了一个带有方法的@SingletonEJB,该方法是用@Schedule注释的。该应用程序部署到wildfly 11。我这里有两个问题。首先,我的计时器每秒钟记录一次,而不是每分钟记录一次。第二个问题是,每次触发时,我都会收到一条错误消息 谁能给我一个提示,我做错了什么?也许我只是瞎了眼,看不见 我的班级: import javax.ejb.Schedule; import javax.ejb.Singleton; import java.uti

我一直在按照程序做计时器,但它不能正常工作。我创建了一个带有方法的
@Singleton
EJB,该方法是用
@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:03025信息[de.klemensmorbe.tracking.DeviceTrackerCronJob](EJB默认值-1)###-伪造某些内容575 12:42:04040错误[org.jboss.as.ejb3.timer](EJB默认值-1)WFLYEJB020:调用计时器超时时出错:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedobject=web.web.DeviceTrackerCronJob自动计时器?:假持久性?:真timerService=org.jboss.as.ejb3.timerService。TimerServiceImpl@c39b6bbinitialExpiration=空间隔持续时间(以毫秒为单位)=0 NextExiration=Wed Jan 03 12:42:05 UTC 2018 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) 位于org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.CalendarTimerTask.invokeBeanMethod(CalendarTimerTask.java:66) 位于org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.CalendarTimerTask.callTimeout(CalendarTimerTask.java:53) 位于org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimerTask.run(TimerTask.java:160) 位于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) 位于java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 位于java.base/java.lang.Thread.run(Thread.java:844) 位于org.jboss.threads//org.jboss.threads.JBossThread.run(JBossThread.java:320)

12:42:04041信息[org.jboss.as.ejb3.timer](EJB默认值-1)WFLYEJB0021:timer:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3-timedobject=web.web.DeviceTrackerCronJob自动计时器?:假持久性?:真timerService=org.jboss.as.ejb3.timerService。TimerServiceImpl@c39b6bbinitialExpiration=空间隔持续时间(毫秒)=0 nextexiration=Wed Jan 03 12:42:05 UTC 2018 timerState=IN_TIMEOUT info=null]将重试 12:42:04041信息[org.jboss.as.ejb3.timer](EJB默认值-1)WFLYEJB0023:重试计时器超时:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedObjectId=web.web.DeviceTrackerCronJob自动计时器?:假持久性?:真timerService=org.jboss.as.ejb3.timerService。TimerServiceImpl@c39b6bbinitialExpiration=空间隔持续时间(毫秒)=0 nextexiration=Wed Jan 03 12:42:05 UTC 2018 timerState=IN_TIMEOUT info=null] 12:42:04042错误[org.jboss.as.ejb3.timer](EJB默认值-1)WFLYEJB0022:重试计时器超时时出错:[id=a797d1ca-e550-41e4-bfe7-46066f7b24b3 timedobject=web.web.DeviceTrackerCronJob自动计时器?:假持久性?:真timerService=org.jboss.as.ejb3.timerService。TimerServiceImpl@c39b6bbinitialExpiration=空间隔持续时间(以毫秒为单位)=0 NextExiration=Wed Jan 03 12:42:05 UTC 2018 timerState=RETRY\u 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) 位于org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.CalendarTimerTask.callTimeout(CalendarTimerTask.java:53) 位于org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimerTask.retryTimeout(TimerTask.java:234) 位于org.jboss.as.ejb3//org.jboss.as.ejb3.timerservice.TimerTask.run(TimerTask.java:168) 位于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) 位于java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 位于java.base/java.lang.Thread.run(Thread.java:844) 位于org.jboss.threads//org.jboss.threads.JBossThread.run(JBossThread.java:320)

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

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

您可能还希望将persistent设置为false,除非您希望服务器在某个时刻停机时能够赶上错过的时间表


我不知道你为什么会出现超时错误。

谢谢你的建议。我修复了计时器,并习惯于使用带锁的EJB。问题是(我认为),计时器不会等待其他计时器完成。我的代码现在看起来像(3.以固定延迟安排任务)。

查看并选择一个修复秒,以每分钟运行一次