首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @多时区定时任务

Spring @多时区定时任务
EN

Stack Overflow用户
提问于 2018-10-04 09:54:46
回答 4查看 3.9K关注 0票数 4

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

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

我不想重复的代码有4个独立的任务为每个区域。

EN

回答 4

Stack Overflow用户

发布于 2018-10-04 10:00:44

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

代码语言:javascript
复制
@Scheduled(cron = "0 10 19 * * FRI", zone = "CET") 
票数 3
EN

Stack Overflow用户

发布于 2018-10-04 17:57:39

这对你来说应该足够了。

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

票数 2
EN

Stack Overflow用户

发布于 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)@有文档记录

代码语言:javascript
复制
   @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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52637910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档