2016-07-20 4 views
2

Ich mag würde mutiple Jobs in meiner spring-batch Anwendung definiert, und zu versuchen, sich wie folgt zu machen modular:Wie konfiguriere ich Spring Batch Jobs modular?

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

Vom SYSOUT kann ich beiden Jobs Bohnen sieht erstellt werden.

ABER: wenn einer dieser Jobs gestartet wird, kann der @Beans dieses Jobs nicht gefunden werden.

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 
} 

Ergebnis: Die reader nicht in der Job-Konfiguration gefunden! Warum?

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 

Warum kann der Leser nicht gefunden werden? Ich meine: Was kann ich mehr tun, als die Bean-Methode selbst zu benennen reader() und injizieren Sie es auch mit Variablenname reader?

Hinweis: Wenn ich die Modulart entfernen und einfach @Configuration auf class Job1 verwenden, läuft der Auftrag gut. Ich bin mir also ziemlich sicher, dass die Konfiguration des Jobs und des Lesers korrekt sein sollte. Aber ich kann natürlich keine ähnliche Jobklasse unterbringen, daher möchte ich Modularität haben.


Edit: wenn ich die @Configuration Anmerkung auf meine Jobs zu aktivieren, ich einen Namen Ausnahme doppelte Job zu bekommen. Deshalb habe ich es im obigen Code nicht.

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 

Antwort

1

Ohne @Configuration Bohnen auf job1 werden nicht registriert. Bitte schauen Sie sich diesen Testfall an Test Configuration

+0

Wenn Ihr Testfall gültig ist, dann ist es seltsam, dass ich eine 'DuplicateJobException' erhalte, wenn ich' @Configuration' zusätzlich zur modularen Registrierung aktiviere. Siehe mein Update oben. – membersound

+0

@membersound in Ihrer Anwendung führen Sie die Registrierungskonfigurationsklassen manuell aus oder scannen Sie ein Paket? Ich denke, Sie sollten die Job-Config-Klassen nicht scannen und lassen GenericApplicationContextFactory es registrieren –

+0

Ich benutze 'Spring-Boot' mit' @ SpringBootApplication', die automatisch die Pakete scannt. Also würden Sie vorschlagen, dass ich das Paket mit den Jobkonfigurationen ausschließen würde? – membersound

Verwandte Themen