簡體   English   中英

如何在春季批處理中同時運行兩個作業

[英]How to Run two jobs simultaneously in spring batch

我正在嘗試使用Spring Batch和Spring Task Scheduler運行兩個作業,而與它們的調度時間無關。 這兩個作業(Tasklets)在不同的時間間隔執行不同的作業。

以下是springConfig.xml文件:

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:batch="http://www.springframework.org/schema/batch" xmlns:task="http://www.springframework.org/schema/batch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd "> <context:component-scan base-package="com.mythribuswebservice.job,com.mythribuswebservice.job.scheduler" /> <bean id="deleteOldOTPS" class="com.mythribuswebservice.job.tasklet.DeleteOldOTPWeekly"></bean> <bean id="couponToggleActivation" class="com.mythribuswebservice.job.tasklet.CouponToggleActivation"></bean> <batch:job id="otpJob" job-repository="jobRepository"> <batch:step id="step1"> <batch:tasklet ref="deleteOldOTPS"> </batch:tasklet> </batch:step> </batch:job> <batch:job id="couponToggleActivation" job-repository="jobRepository"> <batch:step id="couponActivation"> <batch:tasklet ref="couponToggleActivation"> </batch:tasklet> </batch:step> </batch:job> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> <property name="transactionManager" ref="transactionManager" /> </bean> <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://orcl/mythribus" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean> <bean id="oTPJobScheduler" class="com.mythribuswebservice.job.scheduler.OTPJobScheduler"> </bean> <bean id="couponToggleActivationScheduler" class="com.mythribuswebservice.job.scheduler.CouponToggleActivationScheduler"> </bean> </beans> 

以下是CouponToggleActivationScheduler和OTPJobScheduler的實現:

@EnableAsync

@EnableScheduling公共類CouponToggleActivationScheduler {

@Autowired
JobLauncher jobLauncher;
@Autowired
Job couponToggleActivation;
final JobParametersBuilder jobParametersBuilder=new JobParametersBuilder();

@Scheduled(cron = "*/10 * * * * *")
public void runCouponActivationScheduler() {
    System.out.println("CouponToggleActivationScheduler" + new Date()+"-"+couponToggleActivation.hashCode());
    JobExecution execution;
    jobParametersBuilder.addString("couponToggleActivationScheduler", UUID.randomUUID().toString(), true);

        execution = jobLauncher.run(couponToggleActivation, jobParametersBuilder.toJobParameters());
        System.out.println("Exit Status : " + execution.getStatus());


}

}


public class OTPJobScheduler {

@Autowired
JobLauncher jobLauncher;
@Autowired
Job otpJob;
final JobParametersBuilder jobParametersBuilder=new JobParametersBuilder();


@Scheduled(cron = "*/10 * * * * *")
public void runOTPDeleteJob() {
    System.out.println("Ricks...." + new Date()+otpJob.hashCode());
    jobParametersBuilder.addString("otpJobScheduler", UUID.randomUUID().toString(),true);
    JobExecution execution;
        execution = jobLauncher.run(otpJob, jobParametersBuilder.toJobParameters());
        System.out.println("Exit Status : " + execution.getStatus());

}

}


有一些Tasklet可以完成各自的工作:

公共類DeleteOldOTPWeekly實現Tasklet {}

公共類CouponToggleActivation實現Tasklet {}

如果我僅執行一項工作,則一切正常,但是當我安排第二項工作時也會出現異常:

 Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponToggleActivation': Cannot create inner bean '(inner bean)#12e0f78' of type [org.springframework.batch.core.configuration.xml.SimpleFlowFactoryBean] while setting bean property 'flow'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#12e0f78': Cannot create inner bean '(inner bean)#693226' of type [org.springframework.batch.core.job.flow.support.StateTransition] while setting bean property 'stateTransitions' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#693226': Cannot create inner bean '(inner bean)#758545' of type [org.springframework.batch.core.job.flow.support.state.StepState] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#758545': Cannot resolve reference to bean 'couponActivation' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponActivation': Cannot resolve reference to bean 'couponToggleActivation' while setting bean property 'tasklet'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponToggleActivation': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: JobRepository must be set at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:313) at com.mythribuswebservice.MythribusWebserviceApplication.main(MythribusWebserviceApplication.java:15) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#12e0f78': Cannot create inner bean '(inner bean)#693226' of type [org.springframework.batch.core.job.flow.support.StateTransition] while setting bean property 'stateTransitions' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#693226': Cannot create inner bean '(inner bean)#758545' of type [org.springframework.batch.core.job.flow.support.state.StepState] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#758545': Cannot resolve reference to bean 'couponActivation' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponActivation': Cannot resolve reference to bean 'couponToggleActivation' while setting bean property 'tasklet'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponToggleActivation': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: JobRepository must be set at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:299) ... 16 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#693226': Cannot create inner bean '(inner bean)#758545' of type [org.springframework.batch.core.job.flow.support.state.StepState] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#758545': Cannot resolve reference to bean 'couponActivation' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponActivation': Cannot resolve reference to bean 'couponToggleActivation' while setting bean property 'tasklet'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponToggleActivation': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: JobRepository must be set at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:313) ... 24 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#758545': Cannot resolve reference to bean 'couponActivation' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponActivation': Cannot resolve reference to bean 'couponToggleActivation' while setting bean property 'tasklet'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponToggleActivation': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: JobRepository must be set ... 32 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponActivation': Cannot resolve reference to bean 'couponToggleActivation' while setting bean property 'tasklet'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponToggleActivation': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: JobRepository must be set at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) ... 40 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'couponToggleActivation': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: JobRepository must be set ... 50 more Caused by: java.lang.IllegalArgumentException: JobRepository must be set ... 55 more 
我已經刪除了StackTrace。

任何意見。

該錯誤表明couponToggleActivation沒有設置JobRepository。

我認為這是指otpJob作業。

謝謝您的努力。

苦苦掙扎了很長時間之后,我發現宣告couponToggleActivation的Job和Tasklet存在問題。

<batch:job id="couponToggleActivation" job-repository="jobRepository">
    <batch:step id="couponActivation">
        <batch:tasklet ref="couponToggleActivation">

        </batch:tasklet>
    </batch:step>
</batch:job>

我將工作ID和tasklet ref編寫為couponToggleActivation,只是更改了為我工作的工作的名稱。

問題是IOC容器無法識別Job ID和Tasklet Implementer類引用,並且處於歧義狀態。

所以我做到了。

<batch:job id="couponToggleActivationJob" job-repository="jobRepository">
    <batch:step id="couponActivation">
        <batch:tasklet ref="couponToggleActivation">

        </batch:tasklet>
    </batch:step>
</batch:job>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM