![](/img/trans.png)
[英]How to run spring batch jobs simultaneously which share same readers and writers instances?
[英]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
任何意見。
該錯誤表明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.