EJB3 @Schedule定时器在WildFly11中运行异常的技术求助
解决EJB定时器在WildFly 11中的两个问题
针对你遇到的定时器触发频率错误和执行报错问题,我来逐一分析解决:
问题1:定时器每秒触发而非每分钟一次
你当前的@Schedule注解参数配置逻辑有误:
@Schedule(second = "*", minute = "*/1", hour = "*", info = "Every Minute!")
这里second = "*"表示每一秒都会触发,结合minute = "*/1"(每一分钟的周期),实际效果就是每分钟内的每一秒都执行一次,所以看起来是每秒触发。
要实现每分钟执行一次的预期效果,需要把second设为固定值"0",这样定时器只会在每分钟的第0秒触发:
@Schedule(second = "0", minute = "*/1", hour = "*", info = "Every Minute!")
问题2:触发时抛出WFLYEJB0343错误
这个错误的核心原因是WildFly的持久化定时器残留:WildFly默认会将EJB定时器持久化到本地存储(standalone/data/timers目录),当你修改定时器配置、重新部署应用或者修改了EJB类后,旧的持久化定时器依然存在,但它找不到对应的超时方法(日志里显示method null),从而抛出异常。
你可以通过以下几种方式解决:
- 方式1:清理持久化定时器文件
停止WildFly服务器,删除standalone/data/timers目录下的所有文件,然后重新启动服务器。这样旧的定时器就会被清除,新的定时器会根据当前代码重新创建。 - 方式2:设置定时器不持久化
在@Schedule注解中添加persistent = false,这样定时器不会被持久化,重启或重新部署后不会残留:@Schedule(second = "0", minute = "*/1", hour = "*", info = "Every Minute!", persistent = false) - 方式3:通过管理控制台删除旧定时器
登录WildFly管理控制台(默认地址http://localhost:9990),依次进入Deployments-> 你的应用 ->View->EJB Timers,找到对应的旧定时器并删除。
修正后的完整代码
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 = "0", minute = "*/1", hour = "*", info = "Every Minute!", persistent = false) public void execute() { LOG.info("### --- FAKING SOME CONTENT " + counter++); } }
内容的提问来源于stack exchange,提问作者Klemens Morbe
相关产品推荐
相关产品推荐

