You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:10:04