Wildfly/JBOSS 和持久计时器 - 过去 NEXT_RUN 时作业未启动

问题描述 投票:0回答:1

在multiple-wildfly环境中,我们有持久计时器(每分钟运行一次),其中数据存储是数据库类型(Oracle)。 一切似乎都工作正常,JBOSS_EJB_TIMER 是在部署期间创建的,并且每当其中一台服务器运行作业时它都会正确更新。

问题是,由于某种原因,JBOSS_EJB_TIMER 中的 NEXT_DATE 设置为过去的日期(它发生在“脏”wildfly 重新启动期间以及数据库连接出现问题一段时间时) - 当 NEXT_DATE 过去时,该作业似乎根本就没有开始。另一个奇怪的事情是,尽管作业没有运行并且 JBOSS_EJB_TIMER 表没有更新,但我可以看到该作业的 Timer 对象更改了它的下一次运行时间。 有人可以指出我可以做什么的正确方向吗?最残酷的方法是运行另一个作业(不过,这个作业不需要持久化并且可以在多个节点上运行),该作业将检查此列中的值是否不是过去的值。这对我来说听起来很糟糕(预定的工作来检查另一个预定的工作......),但我无法思考/找到另一个解决方案。我希望我只是忽略了时间表注释/wildfly 设置中的一些内容,有人会指出我正确的方向。

以下是一些细节:

有工作的班级

@Startup
@Singleton
public class TestSchedule {

  private final Logger logger = LoggerFactory.getLogger(TestSchedule.class);

  public static final String NAME = "TestScheduleNameYay";


  @Schedule(minute = "*/1", hour = "*", info = NAME)
  public void test() {

    logger.debug("Some test...");

  }

}

这是查询 JBOSS_EJB_TIMER 表中某些列的结果(请注意 NEXT_DATE 是过去的日期):

SELECT INITIAL_DATE, REPEAT_INTERVAL, NEXT_DATE, PREVIOUS_RUN, INFO, TIMER_STATE FROM JBOSS_EJB_TIMER;

,0,2017-06-07 14:22:00.000000,2017-07-06 14:06:51.935000,Az4ZRW1haWxTZW5kZXJTaW5nbGV0b25UaW1lcg==,ACTIVE

日期过去了,作业没有运行,但是,当我迭代计时器(从 TimerService.getAllTimers() 获得)时,我看到我的计时器具有正确的日期(从日志中提取):

id=de67db05-e8d6-40aa-92f8-5e938ffd5eb2 timedObjectId=test-ear.test-ejb.TestSchedule auto-timer?:true persistent?:true timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@c8ba408 initialExpiration=null intervalDuration(in milli sec)=0 nextExpiration=Thu Jul 06 14:32:00 CEST 20
17 timerState=ACTIVE info=TestScheduleNameYay]]

提前致谢!

java timer jboss wildfly
1个回答
0
投票

我遇到了类似的问题(但是使用 Postgres 数据库)并转到

jboss_ejb_timer
表。其中一行在
RETRY_TIMEOUT
列中有
timer_state
,过去有
next_date
。我已经手动修复了该行(到
ACTIVE
状态和稍微未来的
next_date
)并且计时器再次启动。

© www.soinside.com 2019 - 2024. All rights reserved.