当前位置: 首页 > 知识库问答 >
问题:

spring克朗vs普通克朗?

陶宏浚
2023-03-14

我正试图在一个遗留的Java/spring/冬眠项目中工作一个cron作业,所以我决定使用spring调度器。

我想让MyTask.DoStuff在每个月的第一个星期天12点运行。

在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太阳#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表达式是由六个或七个子表达式(字段)组成的字符串

尽管如此,我试着去掉了第7个元素(year),因为它不在任何示例中,但得到了不同的错误消息:

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?spring特有的文档只是说“cron表达式”。

如何使cron表达式在此上下文中按预期工作?任何帮助都将不胜感激。

目前,我的解决方案是简化这个表达式,使其只在每个星期天运行,并预置一些Java逻辑来计算它是哪个星期天,看看这是否有效--但这有悖于配置方法的目的,似乎是一种反模式。

共有1个答案

咸承教
2023-03-14

spring计划任务与cron表达式的格式不同。

它们与UNIX cron表达式的格式不同。

只有6个字段:

  • 第二,
  • 分钟,
  • 小时,
  • 每月的某一天,
  • 月份,
  • 一周的某一天。

星号(*)表示匹配任何。*/X表示“每个X”(见示例)。

一周中的数字天数对我不起作用。此外,“周一-周五”更容易读。下面是一些示例表达式:

“0 0 18**周一至周五”指每个工作日下午6:00。

“0 0*/1***”指整点上的每小时。

“0 0*/8***”指每8小时整点一次。

“0 0 12 1**”指每月第一天晚上12:00。

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

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

 类似资料:
  • 从技术上讲,< code>cron、< code>crontab和< code>cronjob之间有什么区别? 从我能收集到的信息来看,是服务器上的实用程序,是一个包含时间间隔和命令的文件,是实际的命令(或包含命令的文件/脚本)。 这是正确的吗?

  • 当我做crontab-l时,我可以看到我所有的工作。 总之我可以只提取“表情”吗? 我需要这样的外出…

  • 问题内容: 我被Wicket和Vaadin所折服。我正在开始一个微型ISV,需要选择Web框架。我将选择范围缩小到Wicket和Vaadin。我已经使用了两个框架,并且我都喜欢它们。但是我需要做出选择。 如果我选择Vaadin: 我不必担心外观。它带有不错的主题。 我将使用Java进行所有擅长的编程,而不必花费时间来攻克不太擅长的CSS。 我需要的大多数业务应用程序组件都是开箱即用的,包括桌面之类

  • null https://Spring.io/guides/gs/spring-boot/有一个简单的HelloController应用程序,我们也使用Spring MVC开发该应用程序。 除了RAD之外,我看不到任何优势。如果我错了请指正。 我听说Spring Boot是为了方便微服务而设计的。例如,我使用https://spring.io/guides/gs/spring-boot/Hello

  • 这是我用来立即激发job的代码:

  • 问题内容: 假设您不希望其他网站将您的网站“框”为: 因此,您可以在所有页面中插入反框架,框架破坏JavaScript: 优秀的!现在,您可以自动“破坏”或突破包含iframe的任何内容。除了一个小问题。 事实证明, 您的框架破坏代码可以被破坏, 此代码执行以下操作: 每当浏览器尝试通过事件处理程序导航到当前页面之外时,都会增加一个计数器 设置一个计时器,通过触发每毫秒触发一次的计时器,如果看到计