Java TimerService下一个执行时间是

时间:2018-03-19 08:27:50

标签: java glassfish ejb scheduling

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

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

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

这是我编写的测试代码片段,其中展示了问题

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服务器的错误或不正确配置造成的。

1 个答案:

答案 0 :(得分:0)

对于Glassfish来说,这似乎是一个未解决的问题 - issue1issue2。看起来很难重现,因此无法修复。