在我们的应用程序中,我们有一些必须按计划运行的任务。
我们使用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服务器的错误或不正确配置造成的。