web-dev-qa-db-ja.com

コードを実行するときにSpring Batchのスケジュールされたジョブが最初に実行されないようにする方法は?

特定の時間にいくつかのジョブを実行するために、quartzでSpring Batch 2.2.4を使用しています

問題は、最初にコードを実行した後にジョブが常に実行され、その後、スケジュールされた時間に基づいて実行されることです。最初の実行を停止し、スケジュールされた時間に基づいてのみ実行させたい。

私のcron式は「0 0 0 * *?」です&「0 0 0 1/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>
21
Joshua

同じ問題があり、Spring Bootの自動構成サービスが原因であると判断しました。デフォルトでは、アプリケーションの起動後に、構成されたすべてのジョブBeanを実行します。

この動作に影響を与える2つのプロパティがあります。

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

1つ目は、falseに設定されている場合、すべてのジョブの起動を防ぎます。 2番目は、実行されるジョブ名のコンマ区切りリストを受け入れます。

これら2つのプロパティは、 Spring boot docs で指定されたさまざまな方法で設定できます。

  1. コマンドライン (--spring.batch.job.enabled=false
  2. Javaシステムプロパティ(-Dspring.batch.job.enabled=false
  3. OS環境変数
  4. @PropertySourceアノテーション
  5. jarディレクトリのapplication.propertiesファイル
  6. jar内のapplication.propertiesファイル
  7. SpringApplication.setDefaultProperties
49
Chris

追加

spring.batch.job.enabled=false

application.propertiesで私と一緒に動作します。

1
Amir Choubani

これを解決するには、プロパティファイルをもう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")

お役に立てれば。

1
V_J

設定に問題があると思います。これは、同じ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で、ジョブ、アイテムリーダー、アイテムライターなどを定義しました。

0
Karthik Prasad