spring - sirve - ¿Cómo detener los trabajos planificados por lotes de primavera para que se ejecuten por primera vez cuando se ejecuta el código?
spring mvc español (4)
Tuve el mismo problema y determiné que fue causado por el servicio de autoconfiguración de Spring boot. De forma predeterminada, ejecutará todos los beans de trabajo configurados después del inicio de la aplicación.
Hay dos propiedades que afectan este comportamiento:
-
spring.batch.job.enabled
-
spring.batch.job.names
El primero evita el lanzamiento de todos los trabajos cuando se establece en falso. El segundo acepta una lista delimitada por comas de nombres de trabajos que se ejecutarán.
Estas dos propiedades se pueden configurar de varias formas especificadas en los documentos de inicio de Spring :
- Línea de comando (
--spring.batch.job.enabled=false
) - Propiedades del sistema Java (
-Dspring.batch.job.enabled=false
) - Variables de entorno del sistema operativo
- Anotaciones @PropertySource
- archivo application.properties en el directorio jar
- archivo application.properties dentro del contenedor
- SpringApplication.setDefaultProperties
Estoy usando el lote de primavera 2.2.4 con cuarzo para ejecutar algunos trabajos en un momento determinado
el problema es que los trabajos siempre se ejecutan después de ejecutar el código por primera vez y luego se ejecuta según la hora programada. Quiero detener la primera ejecución y dejar que solo se ejecute según la hora programada.
mi expresión cron es "0 0 0 * *?" Y también probé "0 0 0 1/1 *? *", Pero todavía se ejecuta una vez cuando se inicia la aplicación
¿Cómo puedo detener la primera ejecución cuando se inicia la aplicación?
este es el archivo de contexto de trabajo:
<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>
Supongo que hay un problema de configuración. Aquí están las configuraciones que probé con la misma expresión cron. Tengo launch-context.xml con la siguiente configuración.
<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>
En kp-batch.xml, he definido el trabajo, el lector de elementos, la máquina de escribir, etc.
Para resolver esto, deberá crear un archivo de propiedades más y denominarlo "batch.properties".
# Disable batch auto-start
spring.batch.job.enabled=false
Puede dar la referencia a este archivo desde su archivo de configuración java.
Muestra:
@Configuration
@ComponentScan("com.code")
@EnableBatchProcessing
@PropertySource("classpath:batch.properties")
public class AppConfig {
}
@PropertySource ("classpath: batch.properties")
Espero que esto ayude.
agregando
spring.batch.job.enabled=false
en application.properties funciona conmigo.