2015-06-16 18 views
5

Bir rapor oluşturma uygulamam var. Bu tür raporların hazırlanması ağır ağırlık olduğundan, Bahar Batch ile eşzamansız olarak hazırlanır. Bu raporlara yönelik talepler, HTTP kullanılarak REST arayüzü kullanılarak yaratılır.Paralel Yaylı Batch işlerinin sayısı nasıl denetlenir

Amaç, REST kaynağının yalnızca rapor yürütmeyi sıraya alması ve tamamlanmasını (as described in documentation) tamamlamasıdır. Böylece TaskExecutor JobLauncher için sağlanmıştır: raporlar gerçekten ağır sıklet olan

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
     <property name="jobRepository" ref="jobRepository" /> 
     <property name="taskExecutor"> 
     <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"/> 
    </property> 
</bean> 

gibi, bunlardan sadece belirli sayıda belirli bir zamanda üretilebilir. Bir seferde sadece 2 örneklerini üretmek için Bahar Toplu yapılandırmak mümkün umuduyla, concurrencyLimit belirtildi: 2 iş zaten çalışırken

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
     <property name="jobRepository" ref="jobRepository" /> 
     <property name="taskExecutor"> 
     <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"> 
      <property name="concurrencyLimit" value="2" /> 
     </bean> 
    </property> 
</bean> 

yazık ki, fırlatma iş görüşmesi engelleniyor: jobLauncher. koş (iş, builder.toJobParameters());

Görünüşe göre işLauncher hemen iş yürütmeyi deniyor. Bir iş parçacığı müsait olur olmaz, yürütme için sıra beklerim. Bu şekilde, yalnızca aynı iş deposu veritabanını kullanarak ek işlem örnekleri ekleyerek başvurumu ölçeklendirebilirim.

Benzer soru asked here idi. Ben Spring Batch Integration keşfetmeye başlamak üzereyim ama doğru yön bu olup olmadığından emin değilim.

Usecase, benim için nadir görülen bir şey gibi görünmüyor, görünüşe göre bulamamış olduğum geniş bir şekilde tartışılan bir model olmamalı mı? her görev ile yeni bir iş parçacığı olarak çoğaltılır beri

Teşekkür f

cevap

7

SimpleAsyncTaskExecutor ağır kullanım için tavsiye edilmez. Ayrıca, iş parçacığı havuzu oluşturma ve görevlerin sıraya alınması gibi daha sağlam kavramları desteklemez.

ThreadPoolTaskExecutor'a bakarsanız, görevleri sıraya almak ve rasgele, yeniden kullanılmayan iş parçacıkları oluşturmak yerine bir iş parçacığı havuzu kullanmak gibi şeylerle daha sağlam bir görev yürütme paradigmasını destekler.

Burada javadoc içinde ThreadPoolTaskExecutor hakkında daha fazla bilgi edinebilirsiniz: yardımcı http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html

+0

Ayrıca f, iş parçacığı havuzunda Konular sayısını ayarlamak mümkün olacaktır. – rdllopes

3

çok teşekkürler. SimpleAsyncTaskExecutor'ı değiştirdikten sonra tam ihtiyacım olan şeylere sahibim. Kod:

@Bean 
public TaskExecutor jobLauncherTaskExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setMaxPoolSize(executorsPoolSize); 
    executor.setCorePoolSize(executorsPoolSize); 
    return executor; 
} 

Teşekkür

İlgili konular