2016-07-29 5 views
0

Ich habe seltsame Job-Verhalten und kann nicht verstehen, warum das passiert. Ich habe folgendes Frühjahr Batch-Konfiguration:Spring Batch-Commit-Intervall funktioniert nicht und seltsames Verhalten des Jobs

<beans:bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <beans:property name="corePoolSize" value="50"/> 
    <beans:property name="maxPoolSize" value="100"/> 
    <beans:property name="queueCapacity" value="100"/> 
</beans:bean> 



<job id="creationFlowSaveJob"> 
    <step id="creationFlowCampaignSaveStep"> 
     <tasklet task-executor="taskExecutor" 
       throttle-limit="5"> 
      <chunk 
        reader="creationFlowCampaignSaveReader" 
        processor="creationFlowCampaignSaveProcessor" 
        writer="creationFlowCampaignSaveWriter" 
        commit-interval="100" 
        > 
      </chunk> 
     </tasklet> 
     <listeners> 
      <listener ref="generalStepLogger"/> 
     </listeners> 
    </step> 
</job> 

So habe ich Schritt mit Drossel-limit = 5 und Commit-Intervall = „100“ und ich nehme an, dass Schreiber Stück 100 Stück erhalten zu schreiben, und alle Stücke wird einzeln bearbeitet.

Aber ich habe folgende Flow:

Wenn Job 4 Artikel in Fluss hat dann sehe ich, dass Schreiber 1 Punkt erhält und 4 Mal aufrufen, statt einzelne Mal mit 4 Stück. Zusätzlich werden alle diese 4 Aufrufe gleichzeitig ausgeführt, was zur selben Zeit bedeutet, was sehr seltsam ist.

Eine andere seltsame Sache ist, wenn ich task-executor aus tasklet Konfiguration entfernen dann Job beginnt, wie erwartet zu verhalten. Der Chunk der Dateien, der zum Writer kommt, ist 4, oder 100, wenn die Menge der Elemente groß ist und ich keine gleichzeitigen Writer-Aufrufe habe.

Kann jemand erklären, warum das passiert? Warum TaskExecutor Job-Flow auf diese seltsame Weise ändert und was der Zweck, wenn TaskExecutor in Job?

Bitte helfen, dies zu verstehen, Dank

Antwort

0

Mit Task-Testamentsvollstrecker und drossel Grenzen Sie Multi-Thread-Schritt erklären. Sie haben also 5 Threads, die gleichzeitig lesen und schreiben. Wenn Sie dies nicht benötigen, entfernen Sie task-executor und throttle-limit von der Schritt-Deklaration.
Auch wenn Sie verwenden Multi-Threading Sie thread-safe ItemReader und ItemWriter

+0

Dank verwenden sollte dies viel –

+0

up-Abstimmung erklärt und akzeptieren Antwort bitte :) – Dmitry

+0

Das Ziel, das ich achive will, ist, dass ich 5 haben Leser, 5 Prozessoren und 1 Schreiber Also, wenn ich Task Executor entfernen und Gaslimit lassen, wird es funktionieren? Es sollte lesen, verarbeiten in Multi Threading und einmal Artikel Menge gleich Commit-Intervall senden Sie es an Schriftsteller Habe ich richtig verstanden? –