向 Spring @Scheduled 提供时区?

2024-04-20

如何为基于 Spring 的系统配置时区@预定 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling-annotation-support-scheduled计划任务?

背景:

我有一个每天执行一次的工作,比如下午 2 点,使用 Spring@Scheduled注解:

@Scheduled(cron = "0 0 14 * * *")
public void execute() {
    // do scheduled job
}

问题是不同服务器之间的 2 PM 不同,因为 Spring 使用TimeZone.getDefault() 内部 https://github.com/SpringSource/spring-framework/blob/3.2.x/spring-context/src/main/java/org/springframework/scheduling/support/CronSequenceGenerator.java#L81。此外,JavaDoc http://docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html#getDefault() of TimeZone.getDefault()指出:

获取该主机的默认时区。默认时区的来源可能因实现而异。

换句话说,时区是不确定的。它可能取决于 JVM 实现、服务器时区配置、服务器位置和/或其他未知因素。因此,cron 作业会在不同服务器上的不同时间触发,除非有办法明确设置应使用哪个时区?

我正在使用 Spring 3.2.2。


Update

从 Spring 4 开始,Spring Jira 问题SPR-10456 https://jira.spring.io/browse/SPR-10456已经解决了。因此,@Scheduled注释有一个新的zone http://docs.spring.io/spring-framework/docs/4.0.x/javadoc-api/org/springframework/scheduling/annotation/Scheduled.html#zone--属性正是为了这个目的。


结果发现我无法使用@Scheduled注释,但我实现了一个解决方法。在 JavaDoc 中调度配置器 http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/scheduling/annotation/SchedulingConfigurer.html据称:

[SchedulingConfigurer is] 通常用于设置执行计划任务时要使用的特定 TaskScheduler bean,或以编程方式注册计划任务,而不是使用 @Scheduled 注释的声明性方法。

接下来,我更改了 cron 作业来实施Runnable接口,然后更新我的配置文件以实现SchedulingConfigurer, 见下文:

@Configuration
@EnableScheduling
@ComponentScan("package.that.contains.the.runnable.job.bean")
public class JobConfiguration implements SchedulingConfigurer {

    private static final String cronExpression = "0 0 14 * * *";
    private static final String timeZone = "CET";

    @Autowired
    private Runnable cronJob;

    @Bean
    CronTrigger cronTrigger() {
        return new CronTrigger(cronExpression, TimeZone.getTimeZone(timeZone));
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addCronTask(new CronTask(job, cronTrigger()));
    }
}

请阅读 JavaDoc@EnableScheduling http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html了解更多信息。


Update

从 Spring 4 开始,Spring Jira 问题SPR-10456 https://jira.spring.io/browse/SPR-10456已经解决了。因此,@Scheduled注释有一个新的zone http://docs.spring.io/spring-framework/docs/4.0.x/javadoc-api/org/springframework/scheduling/annotation/Scheduled.html#zone--属性正是用于此目的,例如

@Scheduled(cron = "0 0 14 * * *", zone = "CET")
public void execute() {
    // do scheduled job
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向 Spring @Scheduled 提供时区? 的相关文章

随机推荐

  • Treeview——如何滚动直到所选项目位于顶部?

    我正在开发个人文件浏览器应用程序一年 我正在尝试关注我选择的文件夹 例如 如果我说我的默认文件夹是 C Users Me 那么它会自动展开 C 然后是 Users 等等 最后 我选择了 我 文件夹 我没有设法滚动到 自动 这样我就可以在我的
  • 带有异步等待的 chrome.runtime.onMessage 响应

    我想在 onMessage 侦听器中使用异步等待 chrome runtime onMessage addListener async request sender sendResponse gt var key await getKey
  • 简要说明:JDBC 是如何工作的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 访问对象中的属性[重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 属性访问 点符号与方括号 https stackoverflow com questions 4968406 javascript property access dot not
  • 如何撤消“git重置”?

    如何撤消该命令 git reset HEAD 简短回答 git reset HEAD 1 长答案 Git 保留所有引用更新的日志 例如 签出 重置 提交 合并 您可以通过输入以下内容来查看它 git reflog 此列表中的某个位置是您丢失
  • 使用 C++ 的音频流教程和示例代码 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想学习音频流的基础知识 特别是 我
  • 在 Protractor 中定位父元素的推荐方法

    根据最新公布的时尚指南 https github com angular protractor blob master docs style guide md never use xpath 使用by xpath 定位器被认为是一种不好的做
  • Qt5 链接器错误:找不到版本“Qt_5”

    1 问题 我正在尝试构建开源motorcar https github com evil0sheep motorcar在 Arch Linux 机器上从头开始项目 Motorcar 是一款 Linux VR 窗口管理器 可与 Oculus
  • 无法打开原子

    我无法打开 Atom 编辑器 昨天还好好的 今天不知道为什么打不开了 我的电脑上没有 Windows 更新或任何东西 我尝试删除一些在线论坛中提到的 存储 文件夹 但没有帮助 有什么建议么 我使用的是 Atom 版本 1 19 6 0 如果
  • Kafka 连接教程停止工作

    我在此链接中执行了步骤 7 使用 Kafka Connect 导入 导出数据 http kafka apache org documentation html quickstart http kafka apache org documen
  • 链接描述文件未按预期跳过字节

    因此 我有这个汇编文件 我使用 GNU as 进行汇编 并使用链接器脚本与 GNU ld 进行链接 链接描述文件 boot ld INPUT boot o OUTPUT boot out ENTRY boot start SECTIONS
  • 并行处理 vec:如何安全地进行,或者不使用不稳定的功能?

    我有一个巨大的向量 我希望能够并行加载 操作 例如在一个线程中加载前十万个索引 然后在另一个线程中加载下一个索引 依此类推 由于这将是代码中非常热门的部分 因此我提出了以下概念验证不安全代码来在不使用 Arcs 和互斥体的情况下执行此操作
  • 自动持有自旋锁时返回是否不安全?

    受人尊敬的书说 The flags参数传递给spin unlock irqrestore必须与传递给的变量相同spin lock irqsave 您还必须致电spin lock irqsave and spin unlock irqrest
  • C 编程中 @ 符号的使用

    我正在使用一些最初编写的代码IAR https en wikipedia org wiki IAR Systems IAR Embedded Workbench并使用 GCC 编译器将其转换为编译 然而 我被困在某一行 因为我不理解语法或发
  • 创建无法在其板条箱外部实例化的零大小结构的惯用方法是什么?

    我有类似的东西 mod private My crate pub struct A impl A pub fn new gt Self Self fn main External code let obj private A new let
  • 两个或多个(哈希)映射的并集

    我有两个包含相同类型对象的地图 Map
  • 如何使用Delphi 2010优化上传例程?

    My 尚未发布Delphi 2010 应用程序允许用户将他们的文件上传到我的服务器 现在我使用 HTTPS POST 发送文件 简化的 算法基本上是 将文件拆分为 片 每个片 256KB 对于每个切片 将其 POST 到服务器 IE 对于
  • Flex/AS3很奇怪的简单数字运算问题

    我的问题在 Flex 中描述起来非常简单 0 8 0 2 0 6000000000000001 以前有人得到过这个 我确定前两个成员是 0 8 和 0 2 并且是 Number 类 为什么会发生这种情况 另一件事 我从 像这样输入 var
  • Flutter 2.0 与 Firebase Cloud Messaging:在 Android 上未调用 onMessage

    我在 Flutter 2 0 中遇到了 Firebase Cloud Messaging onMessage 问题 功能 FirebaseMessaging onMessage listen RemoteMessage message is
  • 向 Spring @Scheduled 提供时区?

    如何为基于 Spring 的系统配置时区 预定 http static springsource org spring docs 3 2 x spring framework reference html scheduling html s