特定の時間にいくつかのジョブを実行するために、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>
同じ問題があり、Spring Bootの自動構成サービスが原因であると判断しました。デフォルトでは、アプリケーションの起動後に、構成されたすべてのジョブBeanを実行します。
この動作に影響を与える2つのプロパティがあります。
spring.batch.job.enabled
spring.batch.job.names
1つ目は、falseに設定されている場合、すべてのジョブの起動を防ぎます。 2番目は、実行されるジョブ名のコンマ区切りリストを受け入れます。
これら2つのプロパティは、 Spring boot docs で指定されたさまざまな方法で設定できます。
--spring.batch.job.enabled=false
)-Dspring.batch.job.enabled=false
)追加
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")
お役に立てれば。
設定に問題があると思います。これは、同じ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で、ジョブ、アイテムリーダー、アイテムライターなどを定義しました。