我有一个客户在美国各地运营(在所有时区)。我需要在每个时区的凌晨2点运行一个任务。此任务需要时区作为输入,以获取仅与该时区相关的记录。@Scheduled annotation的值为timezone,一次只适用于一个时区。我不想重复的代码,有4个单独的任务,每个区域。
timezone
rdrgkggo1#
使用带注解的分区属性@Scheduled(4.0版新增),请参见下面的示例
@Scheduled(cron = "0 10 19 * * FRI", zone = "CET")
字符串
db2dz4w82#
这个应该够你用了
@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和任务执行的不同关注点分开。另外,请注意选择一个合适的调度程序,它具有在作业运行到下一个作业的触发时间时所需的并行性。
n8ghc7c13#
你能试试这个方法吗?按照java 8 repeatable annotations文档,它应该可以工作,@Repeatable已经包含在@ Schedulled中,所以不需要用@Repeatable注解再次声明@ Schedulledorg.springframework.scheduling.annotation.Scheduled@Repeatable(value=Schedules.class)@Target(value={ANNOTATION_TYPE,METHOD})@Retention(value=RUNTIME)@Documented
@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 annotationshttps://www.javatpoint.com/java-8-type-annotations-and-repeating-annotations
ukxgm1gy4#
一个愚蠢但可行的解决方案是将逻辑的内容放在另一个函数中,并使用不同的调度设置在2个不同的函数中调用调度
@Scheduled(cron = "0 10 19 * * FRI", zone = "CET") public void scheduleCetTask() { // code to get parameters commonTask(parameters); } @Scheduled(cron = "0 10 19 * * FRI", zone = "ABC") public void scheduleAbcTask() { // code to get parameters commonTask(parameters); } public void commonTask(parameters) { }
4条答案
按热度按时间rdrgkggo1#
使用带注解的分区属性@Scheduled(4.0版新增),请参见下面的示例
字符串
db2dz4w82#
这个应该够你用了
字符串
您可能希望将创建调度程序bean和任务执行的不同关注点分开。另外,请注意选择一个合适的调度程序,它具有在作业运行到下一个作业的触发时间时所需的并行性。
n8ghc7c13#
你能试试这个方法吗?按照java 8 repeatable annotations文档,它应该可以工作,@Repeatable已经包含在@ Schedulled中,所以不需要用@Repeatable注解再次声明@ Schedulled
org.springframework.scheduling.annotation.Scheduled
@Repeatable(value=Schedules.class)@Target(value={ANNOTATION_TYPE,METHOD})@Retention(value=RUNTIME)@Documented
字符串
相关文档/链接:java-8 repeatable custom annotationshttps://www.javatpoint.com/java-8-type-annotations-and-repeating-annotations
ukxgm1gy4#
一个愚蠢但可行的解决方案是将逻辑的内容放在另一个函数中,并使用不同的调度设置在2个不同的函数中调用调度
字符串