【发布时间】: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