2016-06-19 5 views
0

Gewinde habe ich eine Feder Batch Chunk Basis Job mit (Custom Reader, individuell gestalteten Prozessor, individuell gestalteter Writer Jeden Thread dieser Reihenfolge folgen soll). Wenn ich 10 Threads starte, sollten sie parallel laufen und ihre eigene Reihenfolge von Lesen, Verarbeiten und Schreiben in der Reihenfolge ausführen.Spring Batch: Wie chunk Verarbeitung zu machen, wie Multi

Thread 1 -> Um: Lesen, Prozess, schreiben

Thread 2 -> Um: Lesen, Prozess, schreibt ... etc

Wie dieses Verhalten zu implementieren. Zur Zeit habe ich Code in Single-Thread-Modell wie folgt arbeiten. (Ich denke. Nicht sicher). Ich möchte Commit-Intervall im Batch: Chunk als '1' nur (Weil ich Datei Zeile für Zeile lesen muss).

<!-- Reader bean for our simple Text file --> 
<bean id="productReader" class="com.mycompany.batching.reader.productItemReader" 
    scope="step"> 
    <property name="userId" value="#{jobParameters['userId']}" /> 
    <property name="dataId" value="#{jobParameters['dataId']}" /> 
</bean> 


<!-- Processor for the data red from text file --> 
<bean id="productProcessor" class="com.mycompany.batching.processor.productItemProcessor"> 
</bean> 

<!-- Persisting data to database --> 
<bean id="productWriter" class="com.mycompany.batching.writer.productItemWriter"> 
</bean> 

<batch:job id="simpleProductImportJob" xmlns="http://www.springframework.org/schema/batch"> 
    <batch:step id="importFileStep"> 
     <batch:tasklet> 
      <batch:chunk reader="productReader" processor="productProcessor" 
       writer="productWriter" commit-interval="1" /> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

Wie macht man dieses Multi-Thread.?

+0

Sie wahrscheinlich einen partitionierten Schritt wollen: http://docs.spring.io/spring-batch/reference/html/scalability.html –

Antwort

0

Der beste Weg, dies zu erreichen, ist die Schrittpartitionierung. Angenommen, Ihre Quelle eine Datei ist, 1. Split die auf einige Logik 2. Partitioner basierte Datei werden die Dateien und weisen jeweils Dateien an die Slaves holen.

Batch-context.xml

<batch:step id="fileProcessMaster"> 
     <batch:partition partitioner="filePartioner" step="readAndInsertToDb"> 
      <batch:handler task-executor="taskExecutor" /> 
     </batch:partition> 
    </batch:step> 

FilePartitioner.java

public class FilePartitioner implements Partitioner{ 

@Override 
public Map<String, ExecutionContext> partition(int gridSize) { 
    Map<String, ExecutionContext> map = new HashMap<String, ExecutionContext>(); 
     int i = 0; 
     File[] files = new File(inboundDirectory).listFiles((FileFilter) new PrefixFileFilter(*); 
     for (File file : files) { 
      //Pick only those files which are splitted 
      if (file.getName().contains("Split")) { 
       ExecutionContext context = new ExecutionContext(); 
       context.putString("file", file.getAbsolutePath()); 
       map.put("slave" + i, context); 
       i++; 
      } 
     } 
     return map; 
} 

Sie haben stellen Sie sicher, dass die Bean-Konfiguration für Partitionierungs Schritt ist scoped.