2016-07-20 3 views
2

は私のspring-batchアプリケーションにみとめJobsを定義し、次のようにそれらはモジュールにしようとしますSYSOUTから春のバッチジョブをモジュール化する方法は?私が好きな

@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); 
    } 
} 

私は両方のジョブBeanが作成され見ることができます。

しかし、それらのジョブの1つが起動されると、そのジョブの@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を挿入する以外に何ができますか?

サイドノート:modulartyを削除してclass Job1@Configurationを使用すると、正常に動作します。だから、私は仕事と読者の構成が正しいと確信しています。もちろん、私は下に同様の職種を実行することはできませんので、私はモジュール化を有効にしたいと思います。


編集:私は私の仕事上の@Configuration注釈を有効にすると、私は重複したジョブ名の例外を取得しています。だから私は上記のコードでそれを持っていないよ。 job1

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 

答えて

1

@Configurationなし豆は登録されません。このテストケースを見てくださいTest Configuration

+0

私はあなたのテストケースが有効ですが、私は '@ Configuration'をモジュラー登録に加えて有効にすると' DuplicateJobException'を得ているのが奇妙です。上記の私の更新を参照してください。 – membersound

+0

@membersoundは、アプリケーションに手動で登録クラスを登録するか、パッケージをスキャンしますか?私はジョブの設定クラスをスキャンしてGenericApplicationContextFactoryに登録させるべきではないと思う。 –

+0

私はパッケージを自動的にスキャンする '@ SpringBootApplication'で' spring-boot'を使っています。だから、私は仕事の構成でパッケージを除外することをお勧めしますか? – membersound

関連する問題