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

如何更改Spring Batch@Scheduled()注释以指定执行时间和时间?

易琨
2023-03-14

我正在处理执行作业的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表达式以获得所需的行为?

    谢谢你

  • 共有2个答案

    龙华翰
    2023-03-14

    关于这两个问题:

    首先,在这种情况下,您必须避免将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属性。

    谭泉
    2023-03-14

    根据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)
     │ │ │ │ │ │
     * * * * * *
    
    1. 您可以使用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的分钟参数。有人知道如何在运行时执行此操作,而不是像在下面的类中对其进行硬编码?如果我要以编程方式进行操作,是否仍可以使用注释? 问题答案: 用于容器在部署期间创建的自动计时器。 另一方面,可以使用它允许您在运行时定义何时应调用该方法。 这可能是您感