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.以固定延迟安排任务)。查看并选择一个修复秒,以每分钟运行一次