Как остановить spring пакетных заданий после запуска в первый раз при выполнении кода?
Я использую spring пакет 2.2.4 с кварцем для запуска некоторых заданий в определенное время
проблема заключается в том, что задания всегда запускаются после выполнения кода в первый раз, тогда он выполняется в соответствии с запланированным временем. Я хочу остановить первый запуск и позволить ему работать только в соответствии с запланированным временем.
мое выражение 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>
Ответы
Ответ 1
У меня была такая же проблема, и я решил, что это вызвано службой автоконфигурации загрузки Spring. По умолчанию он запускает все сконфигурированное задание beans после запуска приложения.
На это поведение влияют два свойства:
-
spring.batch.job.enabled
-
spring.batch.job.names
Первый предотвращает запуск всех заданий, когда установлено значение false. Второй принимает список имен заданий с разделителями-запятыми, которые будут запущены.
Эти два свойства могут быть установлены различными способами, указанными в Spring загрузочных документах:
- Командная строка (
--spring.batch.job.enabled=false
)
- Свойства системы Java (
-Dspring.batch.job.enabled=false
)
- Переменные среды ОС
- аннотации @PropertySource
- файл application.properties в каталоге jar
- файл application.properties внутри контейнера
- SpringApplication.setDefaultProperties
Ответ 2
Я предполагаю, что проблема с конфигурацией. Вот конфигурации, которые я тестировал с одинаковым выражением cron. У меня есть start-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 я определил задание, itemreader, itemwriter и т.д.
Ответ 3
Чтобы решить эту проблему, вам нужно будет создать еще один файл свойств и назовите его "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 ( "путь к классам: batch.properties" )
Надеюсь, что это поможет.
Ответ 4
добавление
spring.batch.job.enabled=false
в application.properties работает со мной.