Spring @Scheduled task in multiple timezones

2guxujil  于 2023-08-02  发布在  Spring
关注(0)|答案(4)|浏览(90)

我有一个客户在美国各地运营(在所有时区)。我需要在每个时区的凌晨2点运行一个任务。此任务需要时区作为输入,以获取仅与该时区相关的记录。
@Scheduled annotation的值为timezone,一次只适用于一个时区。
我不想重复的代码,有4个单独的任务,每个区域。

rdrgkggo

rdrgkggo1#

使用带注解的分区属性@Scheduled(4.0版新增),请参见下面的示例

@Scheduled(cron = "0 10 19 * * FRI", zone = "CET")

字符串

db2dz4w8

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和任务执行的不同关注点分开。另外,请注意选择一个合适的调度程序,它具有在作业运行到下一个作业的触发时间时所需的并行性。

n8ghc7c1

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

@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

ukxgm1gy

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) {
}

字符串

相关问题