我正在处理执行作业的Spring Batch应用程序。作业使用Spring CRON表达式进行调度。
在我的项目中,我有一个SpringBatchExampleJobLauncher类:
@Component
public class SpringBatchExampleJobLauncher {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringBatchExampleJobLauncher.class);
private final Job job;
private final JobLauncher jobLauncher;
private ExecutionContext executionContext;
@Autowired
public SpringBatchExampleJobLauncher(@Qualifier("updateNotaryDistrictsJob") Job job,
JobLauncher jobLauncher,
ExecutionContext executionContext) {
this.job = job;
this.jobLauncher = jobLauncher;
this.executionContext = executionContext;
}
@Scheduled(cron = "0/10 * * * * *")
public void runSpringBatchExampleJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
LOGGER.info("Spring Batch example job was started");
List<NotaryDistrict> notaryDistrictsList = new ArrayList<NotaryDistrict>();
executionContext.put("notaryDistrictsList", notaryDistrictsList);
jobLauncher.run(job, newExecution());
LOGGER.info("Spring Batch example job was stopped");
}
private JobParameters newExecution() {
Map<String, JobParameter> parameters = new HashMap<>();
JobParameter parameter = new JobParameter(new Date());
parameters.put("currentTime", parameter);
return new JobParameters(parameters);
}
}
在这个特定的例子中,使用的CRON异常是:
@Scheduled(cron = "0/10 * * * * *")
所以这项工作每10秒执行一次。这很好,但不适合实际情况。我必须每天在特定的时间和分钟完成我的工作
根据这篇文章中显示的内容:Springcron vs普通cron?
还有这个留档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html
我知道,通过以下方式,我可以在每个月的第一天下午12:00执行我的工作。
"0 0 12 1 * *"
现在我有两个问题:
>
为了测试的目的,我必须每天18:30执行我的工作(基本上我不仅要指定小时,还要指定必须执行工作的时间。此外,我想每天都执行它,而不是像前面的表达式所指定的那样在一个月的第一天)。我如何修改这个CRON表达式以获得所需的行为?
对于下一个生产阶段,我必须改变这种行为,以便在特定的时间和时间,在特定的一周(例如每两周)的特定日期(例如Moday)执行我的工作。例如:工作必须在本月的第一个星期一和第三个星期一下午02:30执行。如何修改这个CRON表达式以获得所需的行为?
谢谢你
关于这两个问题:
首先,在这种情况下,您必须避免将cron表达式直接放在注释中:
@Scheduled(cron = "0/10 * * * * *") // CURRENT
获得解决方案的一个步骤是在应用程序中定义一个属性。yml,比如:
cron:
expresion: 0/10 * * * * *
和代码:
@Scheduled(cron = "${cron.expression}")
这样,你就可以申请了。yml按环境,即:application-prod.yml和生产cron,并使用prod profile运行它。甚至在启动时通过命令行覆盖该属性:
java -jar your-app.jar --cron.expression=0/15 * * * * *
同样的测试案例,你将进行应用程序测试。yml具有用于测试的tunned属性。
根据Spring文档,Cron表达式的格式为:
┌───────────── second (0-59)
│ ┌───────────── minute (0 - 59)
│ │ ┌───────────── hour (0 - 23)
│ │ │ ┌───────────── day of the month (1 - 31)
│ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
│ │ │ │ │ ┌───────────── day of the week (0 - 7)
│ │ │ │ │ │ (or MON-SUN -- 0 or 7 is Sunday)
│ │ │ │ │ │
* * * * * *
0 30 18***
实现第一种情况。星号*
在cron表达式中表示每个
问题内容: 我需要以固定的间隔运行批处理作业,并且能够在运行时更改此批处理作业的时间。为此,我遇到了Spring框架下提供的@Scheduled注释。但是我不确定如何在运行时更改fixedDelay的值。我进行了一些谷歌搜索,但没有发现任何有用的信息。 问题答案: 在spring启动中,你可以直接使用应用程序属性! 例如: 请注意,如果未定义属性,你还可以具有默认值,例如,默认值为“ 60”(秒)
我的Java Web应用程序有一个Cron作业调度程序,它应该每小时触发一次,从早上7点到下午6点。我不知道如何在@scheduled注释中使用zone参数指定PST时区。好心的帮助
项目里使用 @Scheduled注解实现定时任务,设置的是每天凌晨3点20执行一次,但是我本地启动服务发现每天定时任务在14:30就执行了,这个是什么原因。 使用的是springboot3.1.11
问题内容: 我试图在注释中包含一条动态消息,该消息根据传递给它的其他变量中的值来更改文本的主体。我设置了默认消息,但是当设置了某个指示器时,我想显示其他消息。这可能吗? 这是我的注释- 这是注释使用的验证器类- 我最感兴趣的部分是读取的代码- 问题答案: 这是我能够执行此操作的方式-
本文向大家介绍SpringBoot执行定时任务@Scheduled的方法,包括了SpringBoot执行定时任务@Scheduled的方法的使用技巧和注意事项,需要的朋友参考一下 在做项目时,需要一个定时任务来接收数据存入数据库,后端再写一个接口来提供该该数据的最新的那一条。 数据保持最新:设计字段sign的值(0,1)来设定是否最新 定时任务插入数据:首先进行更新,将所有为1即新数据设置过期,然
问题内容: 对于拥有ejb经验的人来说,这可能是一个愚蠢的问题。 我想动态地读取和更改我的其中一个通过注释使用Java EE调度程序的EJB Bean的分钟参数。有人知道如何在运行时执行此操作,而不是像在下面的类中对其进行硬编码?如果我要以编程方式进行操作,是否仍可以使用注释? 问题答案: 用于容器在部署期间创建的自动计时器。 另一方面,可以使用它允许您在运行时定义何时应调用该方法。 这可能是您感