如何在执行代码时阻止Spring Batch定时作业首次运行?

24

我正在使用Spring Batch 2.2.4和Quartz在特定时间运行一些作业。

问题是,作业总是在第一次执行代码后才运行,然后根据计划时间运行。我想停止第一次运行,并让它仅根据计划时间运行。

我的cron表达式是"0 0 0 * * ?",我还尝试了"0 0 0 1/1 * ? *",但它仍会在应用程序启动时执行一次。

如何停止应用程序启动时的第一次执行?

这是作业上下文文件:

<batch:job id="exceptionLogJob">
        <batch:step id="exceptionLogReadWriteStep">
            <batch:tasklet >
                <batch:chunk reader="exceptionLogReader" writer="exceptionLogWriter"
                    commit-interval="1000" />
            </batch:tasklet>
        </batch:step>
    </batch:job>


    <!-- ======================================================= -->
    <!-- READER -->
    <!-- ======================================================= -->
    <bean id="exceptionLogReader"
        class="org.springframework.batch.item.database.JdbcCursorItemReader">
        <property name="dataSource" ref="dataSource" />
        <property name="sql" value="SELECT a.*,a.rowid FROM SF_EXCEPTION_LOG a WHERE DATETIME  > SYSDATE - 1" />
        <property name="rowMapper" ref="ExceptionLogRowMapper" />
    </bean>
    <!-- ======================================================= -->
    <!-- Writer -->
    <!-- ======================================================= -->
    <bean id="exceptionLogWriter"
        class="com.mobily.sf.batchprocessor.exceptionlog.ExceptionLogWriter" />

            <bean id="jobDetailExceptionLog" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass"
            value="com.sf.batchprocessor.commons.JobLauncherDetails" />
        <property name="jobDataAsMap">
            <map>
                <entry key="jobName" value="exceptionLogJob" />
                <entry key="jobLocator" value-ref="jobRegistry" />
                <entry key="jobLauncher" value-ref="jobLauncher" />
            </map>
        </property>
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <bean id="cronTrigger"
                class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
                <property name="jobDetail" ref="jobDetailExceptionLog" />
                <property name="cronExpression" value="0 0 0 1/1 * ? *" />
            </bean>
        </property>
    </bean>

</beans>

你的意思是说第一次运行会在应用程序启动时立即运行,而不考虑 cron 表达式吗? - Karthik Prasad
我曾遇到过类似的问题,但很快意识到是由于cron表达式引起的。你能分享一下你的cron表达式吗? - Karthik Prasad
没问题,它是“0 0 0 * * ?”。 - Joshua
你能使用这个cron表达式吗?“0 0 0 1/1 * ? *”,希望开头没有空格。这是cron表达式的输出结果:2014年3月13日AD,IST时间00:00:00;2014年3月14日AD,IST时间00:00:00;2014年3月15日AD,IST时间00:00:00;2014年3月16日AD,IST时间00:00:00。 - Karthik Prasad
我尝试过了,不幸的是问题还是一样的。 - Joshua
显示剩余3条评论
4个回答

55

我曾经遇到同样的问题,并确定是Spring Boot的自动配置服务引起的。默认情况下,它会在应用启动后运行所有配置的作业bean。

有两个属性影响此行为:

  • spring.batch.job.enabled
  • spring.batch.job.names

第一个属性当设置为false时可以阻止启动所有作业。第二个属性接受由逗号分隔的作业名称列表。

这两个属性可以使用多种指定方式进行设置,具体方法详见Spring boot文档

  1. 命令行(--spring.batch.job.enabled=false
  2. Java系统属性(-Dspring.batch.job.enabled=false
  3. 操作系统环境变量
  4. @PropertySource注释
  5. 位于jar目录中的application.properties文件
  6. 位于jar内部的application.properties文件
  7. SpringApplication.setDefaultProperties

1
Chris,我尝试在application.properties文件中添加spring.batch.job.enabled=false,并尝试使用Java系统属性运行,但仍然会运行批处理作业。 - Anuj Acharya
@AnujAcharya:尝试一下我的答案,它会有所帮助。 - V_J

3

添加

spring.batch.job.enabled=false

在 application.properties 文件中能够正常工作。


1
为了解决这个问题,您需要创建一个名为“batch.properties”的属性文件。
# Disable batch auto-start
spring.batch.job.enabled=false

你可以在Java配置文件中引用此文件。
示例:
@Configuration
@ComponentScan("com.code")
@EnableBatchProcessing
@PropertySource("classpath:batch.properties")
public class AppConfig {

}

@PropertySource("classpath:batch.properties")

希望这有所帮助。

0

我猜是某些配置问题。这里是我用相同的cron表达式测试过的配置。我在launch-context.xml中使用以下配置。

<bean class="org.springframework.batch.core.configuration.support.AutomaticJobRegistrar">
    <property name="applicationContextFactories">
        <bean
            class="org.springframework.batch.core.configuration.support.ClasspathXmlApplicationContextsFactoryBean">

            <property name="resources">
                <list>
                    <value>classpath*:configurations/kp-batch.xml</value>
                </list>
            </property>

        </bean>
    </property>

    <property name="jobLoader" >
        <bean
            class="org.springframework.batch.core.configuration.support.DefaultJobLoader">
            <property name="jobRegistry" ref="jobRegistry" />
        </bean>
    </property>
</bean>

<bean id="jobRegistry"
    class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

<bean id="schedule"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger1"/>
        </list>
    </property>
</bean>

<bean id="cronTrigger1"
    class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="kpJobDetail" />
    <property name="cronExpression" value="0 0 0 1/1 * ? *"/>
</bean>

<bean id="kpJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass"
        value="com.viasat.nbn.nms.webservices.util.SpringBatchQuartzJobLauncher" />
    <property name="jobDataAsMap">
        <map>
            <entry key="jobName" value="Trigger Job for 12AM" />
            <entry key="jobLocator" value-ref="jobRegistry" />
            <entry key="jobLauncher" value-ref="jobLauncher" />
        </map>
    </property>
</bean>

<bean id="batchTransactionManager"
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager">
    <property name="rollbackOnCommitFailure" value="false" />
</bean>

<bean id="jobLauncher"
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>

<bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="batchTransactionManager" />
</bean>

在 kp-batch.xml 文件中,我定义了 job、itemreader、itemwriter 等内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接