web-dev-qa-db-ger.com

wie kann man verhindern, dass geplante Frühlingsjobs zum ersten Mal ausgeführt werden, wenn der Code ausgeführt wird?

ich benutze Spring Batch 2.2.4 mit Quarz, um einige Jobs zu einem bestimmten Zeitpunkt auszuführen

das Problem ist, dass die Jobs immer ausgeführt werden, nachdem der Code zum ersten Mal ausgeführt wurde, und dann basierend auf der geplanten Zeit ausgeführt wurden. Ich möchte den ersten Lauf stoppen und nur nach der geplanten Zeit ausführen lassen.

mein Cron-Ausdruck ist "0 0 0 * *?" & Ich habe auch "0 0 0 1/1 *? *" Versucht, es wird jedoch immer noch einmal ausgeführt, wenn die Anwendung gestartet wird 

wie kann ich die erste Ausführung stoppen, wenn die Anwendung gestartet wird? 

dies ist die Jobkontextdatei:

<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

Ich hatte das gleiche Problem und stellte fest, dass es durch den Autokonfigurationsdienst von Spring Boot verursacht wurde. Standardmäßig werden alle konfigurierten Job-Beans nach dem Start der Anwendung ausgeführt. 

Es gibt zwei Eigenschaften, die dieses Verhalten beeinflussen: 

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

Die erste verhindert, dass alle Jobs gestartet werden, wenn sie auf false gesetzt ist. Die zweite akzeptiert eine durch Kommas getrennte Liste der Jobnamen, die ausgeführt werden.

Diese beiden Eigenschaften können auf verschiedene Weise in den Spring-Startdokumenten festgelegt werden:

  1. Befehlszeile (--spring.batch.job.enabled=false)
  2. Java-Systemeigenschaften (-Dspring.batch.job.enabled=false)
  3. Betriebssystemumgebungsvariablen
  4. @PropertySource-Anmerkungen
  5. datei application.properties im Verzeichnis jar
  6. application.properties-Datei im Jar
  7. SpringApplication.setDefaultProperties
46
Chris

Um dieses Problem zu lösen, müssen Sie eine weitere Eigenschaftendatei erstellen und "batch.properties" nennen.

# Disable batch auto-start
spring.batch.job.enabled=false

Sie können den Verweis auf diese Datei in Ihrer Java-Konfigurationsdatei angeben.

Probe:

@Configuration
@ComponentScan("com.code")
@EnableBatchProcessing
@PropertySource("classpath:batch.properties")
public class AppConfig {

}

@PropertySource ("Klassenpfad: batch.properties")

Hoffe das hilft.

1
V_J

hinzufügen

spring.batch.job.enabled=false

in application.properties funktioniert bei mir.

0
Amir Choubani

Ich schätze mal ein Konfigurationsproblem. Hier sind die Konfigurationen, die ich mit demselben Cron-Ausdruck getestet habe. Ich habe launch-context.xml mit der folgenden Konfiguration.

<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>

In der kp-batch.xml habe ich job, itemreader, itemwriter usw. definiert.

0
Karthik Prasad