2016-03-24 12 views
2

Ich habe einen Feder-Batch-Job konfiguriert, der in einem Feder-Webservice ausgeführt wird. Der Job hat ein paar Schritte. Ich habe zwei Instanzen dieses Webservice in verschiedenen Tomcats bereitgestellt (aber beide Instanzen verwenden dieselbe mysql-Datenbank).Mehrere Spring-Batch-Jobs gleichzeitig mit verschiedenen Parametern ausführen

Ich möchte einen Spring-Batch-Job gleichzeitig in beiden Tomcats (einer in jedem) mit verschiedenen Parametern ausführen. Ich verwende keine Partioning und die Parameter für jeden Job sind völlig unterschiedlich.

Ich beginne den Job in einem der Tomcats und alles sieht gut aus. Aber wenn ich einen zweiten Job im zweiten Tomcat starte, wird der Job erstellt, aber er startet nicht, nicht einmal den Code der ersten Zeile des ersten Schrittes ausführen.

Ich bin kein Experte mit Spring Batch, also vielleicht mache ich etwas falsch. Wenn der Spring-Batch-Job jedoch in zwei separaten Tomcat-Instanzen ausgeführt wird, sollten sie parallel ausgeführt werden.

Dies ist die Job-Konfiguration:

<?xml version="1.0" encoding="UTF-8"?> 
    <beans 
     xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:batch="http://www.springframework.org/schema/batch" 
     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-3.0.xsd"> 

     <job id="uploadProjectDataJobNormal " xmlns="http://www.springframework.org/schema/batch"> 
      <step id="setupProject" next="loadReferenceBuilds"> 
       <tasklet ref="projectSetupTasklet"/> 
       <listeners> 
        <listener ref="promotionListener"/> 
        <listener ref="snpAwareStepListener"/> 
        <listener ref="snpAwareItemReadListener"/> 
       </listeners> 
      </step> 

     <step id="loadReferenceBuilds" next="snpToMorph"> 
      <tasklet> 
       <chunk reader="faiReader" processor="faiProcessor" writer="faiWriter" commit-interval="100"/> 
      </tasklet> 
      <listeners> 
       <listener ref="promotionListener"/> 
       <listener ref="snpAwareStepListener"/> 
       <listener ref="snpAwareItemReadListener"/> 
      </listeners> 
     </step> 

     <step id="snpToMorph" next="indelToMorph"> 
      <tasklet> 
       <chunk reader="snpReader" processor="snpProcessor" writer="snpWriter" commit-interval="100"/> 
      </tasklet> 
      <listeners> 
       <listener ref="promotionListener"/> 
       <listener ref="snpAwareStepListener"/> 
       <listener ref="snpAwareItemReadListener"/> 
      </listeners> 
     </step> 

     <step id="indelToMorph"> 
      <tasklet> 
       <chunk reader="indelReader" processor="indelProcessor" writer="indelWriter" commit-interval="100"/> 
      </tasklet> 
      <listeners> 
       <listener ref="promotionListener"/> 
       <listener ref="snpAwareStepListener"/> 
       <listener ref="snpAwareItemReadListener"/> 
      </listeners> 
     </step> 
<listeners> 
      <listener ref="snpAwareBatchJobListener"/> 
     </listeners> 
</job> 

Dies ist, wie ich die Jobs zu starten:

this.jobLauncher.run (this.uploadProjectDataJobNormal, jobParameters);

Die Job-Parameter haben bestimmte Parameter, die zwischen den beiden Jobs eindeutig sind, wie ein Datum, der Name des Elements, das ich hochladen möchte.

Der Job-Repository und Launcher werden im nächsten Weise konfiguriert:

/** 
* Job repository. 
* 
* @return the job repository. 
* @throws Exception in case the job repository could not be created. 
*/ 
@Bean 
public JobRepository jobRepository() throws Exception { 
    JobRepositoryFactoryBean jobRepositoryFactory = new JobRepositoryFactoryBean(); 
    jobRepositoryFactory.setDataSource(this.persistenceConfig.dataSource()); 
    jobRepositoryFactory.setTransactionManager(this.persistenceConfig.transactionManager()); 
    jobRepositoryFactory.setIsolationLevelForCreate("ISOLATION_DEFAULT"); 
    return jobRepositoryFactory.getJobRepository(); 
} 

/** 
* Job launcher. 
* 
* @return the job launcher. 
* @throws Exception in case the job launcher could not be created. 
*/ 
@Bean 
public JobLauncher jobLauncher() throws Exception { 
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); 
    jobLauncher.setJobRepository(this.jobRepository()); 
    jobLauncher.setTaskExecutor(this.taskExecutor()); 
    return jobLauncher; 
} 

/** 
* Task executor. 
* 
* @return the task executor. 
*/ 
@Bean 
public TaskExecutor taskExecutor() { 
    SimpleAsyncTaskExecutor ex = new SimpleAsyncTaskExecutor(); 
    ex.setConcurrencyLimit(1); 
    return ex; 
} 

UPDATE: Eine Lösung, die ich schaffen thinked etwa ist eine zweite Aufgabe Erklärung unter einem anderen Namen wie "uploadProjectDataJobNormal2". Wird das helfen?

Antwort

2

Am Ende war die Lösung einfach als erwartet. Ändern Sie den gemeinsamen Zugriff auf 2 in der Job-Launcher:

ex.setConcurrencyLimit(2); 

Mein war der Meinung, dass nicht beeinflussen, wenn die Feder Batch-Jobs in differents JVM ausgeführt werden, aber es funktioniert.

Verwandte Themen