当前位置: 首页 > 面试题库 >

Spring cron与普通cron?

纪枫
2023-03-14
问题内容

我正在尝试在旧版Java / Spring / Hibernate项目中执行cron作业,因此我决定使用spring调度程序。

我希望myTask.doStuff在每个月的第一个星期日的12:00运行。

在我的application-context.xml中,我已将任务调度程序配置为:

<task:scheduled-tasks scheduler="MyTaskScheduler">
    <task:scheduled ref="myTask" method="doStuff" cron="0 0 12 ? 1/1 SUN#1 *"/> <!-- Every first Sundy of the month -->
</task:scheduled-tasks>

<task:scheduler id="MyTaskScheduler" pool-size="10"/>

问题cron表达式本身是: 0 0 12? 1/1 SUN#1 *

并且myTask是一个bean,它有一个名为方法doStuff从单元测试运行时完美的作品。

当我构建和部署时,我从spring得到了bootime异常

Caused by: java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 7 in 0 0 12 ? 1/1 SUN#1 *)
at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:233)
at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44)
at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:129)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)

鉴于我是第一次使用cron表达式,因此我的第一个假设是我做错了什么,但是我使用cronmaker再次检查了一下,结果还是一样。

所有文档都说:cron表达式是由六个或七个子表达式(字段)组成的字符串。1个

尽管如此,我还是尝试取消第7个元素(年份),因为它不在任何示例中,并且得到了不同的错误消息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.config.ScheduledTaskRegistrar#0': Invocation of init method failed; nested exception is java.lang.NumberFormatException: For input string: "0#1"


org.springframework.scheduling是否支持与其他所有东西不同的cron风格?春季专用文档只说了“ cron表达式”。

在这种情况下,如何使该cron表达式按预期工作? 任何帮助将不胜感激。

目前,我的解决方案是简化该表达式,使其仅在每个星期日运行,并添加一些Java逻辑以计算该月的哪个星期日,并查看是否可行-
但这违反了配置方法的目的,并且似乎是一种反模式。


问题答案:

Spring Scheduled任务与cron表达式的格式不同。

它们不遵循与UNIX cron表达式相同的格式

只有6个字段:秒,分钟,小时,一个月中的某天,一个月,一周中的天。星号()表示匹配任何一个。 /X表示“每个X”(请参阅​​示例)。一周中的数字天对我不起作用。此外,“ MON-FRI”更容易阅读。以下是一些示例表达式:

“ 0 0 18 * * MON-FRI”是指每个工作日的下午6:00。

“ 0 0 * / 1 * ”表示小时中的每个小时。

“ 0 0 * / 8 * ”表示每小时8小时。

“ 0 0 12 1 * *”表示每月第一天的12:00 PM。

在这里您可以找到一些其他信息:http :
//docs.spring.io/spring/docs/current/javadoc-
api/org/springframework/scheduling/support/CronSequenceGenerator.html

另外,您可能会发现spring文档很有用:[https]( https://docs.spring.io/spring-
framework/docs/current/spring-framework-reference/integration.html#scheduling)
//docs.spring.io/spring-framework/docs/current/spring-framework-
reference/integration.html#scheduling


 类似资料:
  • 问题内容: 如果下面的代码会产生相同的结果,为什么还要使用封装? 封装的主要好处是能够修改我们已实现的代码而不会破坏其他使用我们代码的人的代码。 但是我可以在不使用封装的情况下使用此好处,对吗?因为每个对象的字段都彼此不同。 问题答案: 您的问题很有趣。我将尽力为您解答。 封装 背后的主要思想 是向 其他用户 隐藏数据及其实现 细节。如果我们将数据成员设为 私有 ,则只能在同一类中访问它。没有其他

  • 在阅读了关于ForkJoinPool的文章之后,我尝试了一个实验,测试与普通递归相比,实际上有多快。 我以递归的方式计算了文件夹中的文件数,令我满意的是,简单的递归比执行得更好 这是我的密码。 递归任务 纯递归 null

  • 问题内容: 我应该使用php PDO还是普通的mysql_connect在PHP中执行数据库查询? 哪一个更快? PDO的一大优点是接口在多个数据库之间是一致的。对于准备好的语句,也有一些很酷的功能,这些功能避免了转义所有查询字符串的麻烦。PDO的可移植性大于mysql_connect。 那么,出于这些原因,我应该使用PDO还是坚持使用传统的mysql_connect? 问题答案: PDO比mys

  • 重复执行一系列命令:可以指定表示重复次数的数字或直到遇到 break。 Loop [, Count] 参数 Count 执行循环体 (重复) 的次数. 如果省略, Loop 会无期限继续, 直到遇到 break 或 return. 如果 Count 是一个变量引用例如 %ItemCount%, 每当此变量为空或包含小于 1 的数字时, 循环会被完全跳过. 由于必须支持 文件模式循环, Count

  • 有人能告诉我用两种不同的方法调用同一个函数的区别,以及编译器在这两种情况下到底做了什么;比如:

  • 问题内容: 我想将Reactsearch与我自己的普通香草elasticsearch集群一起使用。尽管示例和文档描述这应该 可行:ReactiveBase,请参见 Param. 我收到连接错误和一个Websocket调用 看起来像是 试图连接到 托管弹性体。它还会传递凭证代码以及对我的代码中未指定的对elastic的调用。 是否可以连接到普通弹性件?在哪里可以找到有关此方法的 文档? 这是我的定义