Spring @Scheduled任务在多个时区

时间:2018-10-04 01:54:46

标签: java spring spring-boot scheduler taskscheduler

我有一个客户遍及美国(在所有时区)。我需要在每个时区的凌晨2点运行一个任务。此任务需要时区作为输入,以仅提取与该时区相关的记录。

@Scheduled批注具有timezone值,一次只能使用一个时区。

我不想通过为每个区域执行4个单独的任务来重复代码。

3 个答案:

答案 0 :(得分:2)

使用带注释@Scheduled的区域属性(添加4.0版) 参见下面的示例

public static void addFirst(double element) {
    if (head == null) {
        DoubleNode node = new DoubleNode(element, null);
        head = tail = node;
        precursor = cursor = head;
    } else {
        DoubleNode node = new DoubleNode(element, head);
        head = precursor = node;
        cursor = precursor.getLink();
    }
    manyNodes++;
    System.out.println("Node Count: " + manyNodes);
}

答案 1 :(得分:1)

您可以尝试这种方法吗? 根据Java 8 repeatable annotations文档,它应该可以使用,@ Scheduled中已经包含了@Repeatable,因此无需使用@Repeatable批注再次声明@scheduled

  

org.springframework.scheduling.annotation.Scheduled

     

@Repeatable(value = Schedules.class)    @Target(value = {ANNOTATION_TYPE,   方法})   @Retention(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

答案 2 :(得分:0)

这应该为你做。

@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和任务执行的不同方面。另外,请小心选择合适的调度程序,该调度程序具有在作业运行到下一个作业的触发时间内的所需并行性。