我有一个客户,业务遍及美国(在所有时区)。我需要在每个时区的凌晨2点运行一个任务。此任务需要时区作为输入,以获取仅与该区域相关的记录。
@Scheduled注解有timezone值,一次只能使用一个时区。
我不想重复的代码有4个独立的任务为每个区域。
发布于 2018-10-04 10:00:44
使用带有注释@Scheduled的区域属性(版本4.0增加)请参见下面的示例
@Scheduled(cron = "0 10 19 * * FRI", zone = "CET") 发布于 2018-10-04 17:57:39
这对你来说应该足够了。
@Slf4j
@Configuration
public class TestBean implements SmartInitializingSingleton {
@Inject
TaskScheduler scheduler;
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler te = new ThreadPoolTaskScheduler();
te.setPoolSize(4);
return te;
}
@Override
public void afterSingletonsInstantiated() {
Arrays.stream(new String[] {"PST", "MST", "CST", "EST"})
.forEach(zone -> {
scheduler.schedule(() -> {
log.info("Zone trigged: {}", zone);
}, new CronTrigger("0 0 2 * * *", TimeZone.getTimeZone(zone)));
});
}
}您可能希望将创建调度程序bean和任务执行的不同关注点分开。此外,在作业运行到下一个作业的触发时间时,请注意选择具有所需并行性的合适调度程序。
发布于 2018-10-04 14:29:54
你能试试这种方法吗?根据java 8 repeatable annotations文档,@Repeatable已经包含在@Scheduled中,所以不需要用@Repeatable注解再次声明@scheduled
org.springframework.scheduling.annotation.Scheduled
@可重复(value=Schedules.class)@目标(value={ANNOTATION_TYPE,METHOD}) @保留(value=RUNTIME)@有文档记录
@Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")
@Scheduled(cron = "0 1 1,15 * * ?", zone = "SGT")
public void doScheduledWork() {
//complete scheduled work
}
.
.
.相关文档/链接:java-8 repeatable custom annotations https://www.javatpoint.com/java-8-type-annotations-and-repeating-annotations
https://stackoverflow.com/questions/52637910
复制相似问题