【问题标题】:Java TimerService next execution time is in pastJava TimerService 下一个执行时间是过去的
【发布时间】:2018-03-19 08:27:49
【问题描述】:

在我们的应用程序中,我们有一些必须按计划运行的任务。 我们使用TimerService 来安排它们应该运行的时间,并且它们一直运行良好,直到我们安排其中一个在星期六运行。

如果计划配置中的星期几值包含6,则由于timerService.getTimers().iterator().next().getNextTimeout() 返回过去的日期,因此在星期六该任务每秒运行一次。

例如,如果任务计划在 3 月 17 日星期六 08:00:01 从星期一到星期六运行,那么它在星期六 08:00:01 运行,getNextTimeout() 方法返回下一个执行时间截至 3 月 12 日星期一 08:00:01,这将导致任务再次运行并再次返回相同的下一次执行时间,依此类推。

这是我写的一个测试的代码 sn-p,它显示了这个问题

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.*;

@Singleton
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class TestTimer {
    Logger logger = LoggerFactory.getLogger(TestTimer.class);

    @Resource
    private TimerService timerService;


    @PostConstruct
    public void initTimer() {
        TimerConfig tc = new TimerConfig();
        tc.setInfo("TimerTest");
        tc.setPersistent(false);

        timerService.createCalendarTimer(
                new ScheduleExpression()
                    .second(1)
                    .minute(0)
                    .hour(8)
                    .dayOfMonth("*")
                    .dayOfWeek("1-6"),tc);
        logger.info("Timer: "+tc.getInfo());
    }

    @Timeout
    public void execute() {
        logger.info("Executing "+TestTimer.class);
    }

}

我看不到我编写的代码有任何问题,这让我相信错误可能是由于部署应用程序的 Glassfish 服务器的错误或配置不当造成的。

【问题讨论】:

  • 这个不清楚。您发布的测试代码是否正确运行,还是会重现周六时间表的问题?
  • 您是不是也说如果dayOfWeek 设置为1-5,日程会按您预期的方式滚动到下周?
  • 该测试确实显示了周六运行每秒的问题。如果将 dayOfWeek 设置为 1-5,则计划的行为将按预期滚动到下周。
  • 如果你让定时器持久化会发生什么?
  • 使计时器持久化并没有改变它的行为 - 它仍然每秒运行一次。

标签: java glassfish ejb scheduling


【解决方案1】:

看起来这是 Glassfish 的未解决问题 - issue1issue2。看起来很难重现,因此没有可用的修复程序。

【讨论】:

  • 您应该将您的信息(以及更简单的示例)添加到未解决的问题中。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多