有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Wildfly/JBOSS和持久计时器作业在过去的下一次运行时未启动

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

问题是,由于某种原因,JBOSS_EJB_计时器中的下一个_日期被设置为过去的日期(它发生在“脏”wildfly重新启动期间,以及数据库连接出现问题一段时间)-当下一个_日期过去时,作业似乎根本没有开始。另一件奇怪的事情是,尽管作业并没有运行,JBOSS_EJB_定时器表也并没有更新,但我可以看到这个作业的定时器对象改变了它的下一个运行时间。 有人能告诉我该怎么做吗?最残酷的方法是运行另一个作业(不过,这个作业不需要是持久的,并且可以在多个节点上运行),它将检查此列中的值是否不在过去。这对我来说听起来很糟糕(检查另一个计划作业的计划作业…),但我想不出另一个解决办法。我希望我只是忽略了日程表注释/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_计时器表中某些列的结果(请注意,下一个日期是过去的):

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

由于date在过去,作业没有运行,但当我迭代计时器(从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]]

提前谢谢


共 (0) 个答案