2
我想在我的spring-batch
應用程序定義的多發Jobs
,並努力使他們模塊化如下:如何配置彈簧批量作業模塊化?
@Configuration
@EnableBatchProcessing(modular = true)
public class ModularConfig {
@Bean
public ApplicationContextFactory getJob1() {
Sysout("job1");
return new GenericApplicationContextFactory(Job1.class);
}
@Bean
public ApplicationContextFactory getJob2() {
Sysout("job2");
return new GenericApplicationContextFactory(Job2.class);
}
}
從SYSOUT我可以看到創建工作都豆。
但是:當其中一個作業啓動時,找不到該作業的@Beans
。
public class Job1 {
@Bean
public Job job(Step step) {
return jobFactory.get("job1")
.start(step)
.build();
}
@Bean
public Step step(ItemReader<String> reader, ItemProcessor<String, String> processor, ItemWriter<String> writer) {
return stepFactory.get("importStep")
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
@JobScope
public IteamReader<String> reader(@Value("#{jobParameters['filename']}") String filename) {
//returns a FlatFileItemReader<String>
}
//omitted also `@Bean` for processor + writer
}
結果:在作業配置中找不到reader
!爲什麼?
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'reader' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:698) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1175) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:596) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.GenericTypeAwareAutowireCandidateResolver.checkGenericTypeMatch(GenericTypeAwareAutowireCandidateResolver.java:95) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.GenericTypeAwareAutowireCandidateResolver.isAutowireCandidate(GenericTypeAwareAutowireCandidateResolver.java:64) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver.isAutowireCandidate(QualifierAnnotationAutowireCandidateResolver.java:142) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.isAutowireCandidate(DefaultListableBeanFactory.java:687) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.isAutowireCandidate(DefaultListableBeanFactory.java:646) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.isAutowireCandidate(DefaultListableBeanFactory.java:630) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1191) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
... 34 more
那麼爲什麼不能找到讀者?我的意思是:除了命名Bean方法本身reader()
並且還將其注入變量名reader
?
旁註:當我刪除模塊化並在class Job1
上使用@Configuration
時,那麼作業運行良好。所以我很確定工作和讀者的配置應該是正確的。但是我當然不能在下面運行類似的工作類,所以我想要啓用模塊化。
編輯:當我使我的工作的@Configuration
註釋,我得到一個重複的作業名例外。這就是爲什麼我沒有在上面的代碼中。
Caused by: org.springframework.batch.core.configuration.DuplicateJobException: A job configuration with this name [job1] was already registered
at org.springframework.batch.core.configuration.support.MapJobRegistry.register(MapJobRegistry.java:51) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]
at org.springframework.batch.core.configuration.support.DefaultJobLoader.doRegister(DefaultJobLoader.java:258) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]
at org.springframework.batch.core.configuration.support.DefaultJobLoader.doLoad(DefaultJobLoader.java:193) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]
at org.springframework.batch.core.configuration.support.DefaultJobLoader.load(DefaultJobLoader.java:151) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]
at org.springframework.batch.core.configuration.support.AutomaticJobRegistrar.start(AutomaticJobRegistrar.java:173) ~[spring-batch-core-3.0.7.RELEASE.jar:3.0.7.RELEASE]
... 16 more
我的測試用例是有效的,那很奇怪我在模塊化註冊之外啓用'@ Configuration'時出現'DuplicateJobException'。看到我上面的更新。 – membersound
@membersound在你的應用程序中你手動註冊器配置類還是掃描一個包?我認爲你不應該掃描作業配置類並讓GenericApplicationContextFactory註冊它 –
我正在''SpringBootApplication'使用'spring-boot',它自動掃描包。所以你會建議我將作業配置中的軟件包排除在外? – membersound