2011-11-11 23 views
1

我正在使用石英來安排春季批量作業。我們可以創建同一個java(spring)批處理作業的多個實例嗎?

作業從文件夾(具有多個文件)讀取文件進行一些處理並將其複製到另一個文件夾。

是否可以創建作業的多個實例,並行運行,讀取多個文件?

我的問題是:

春天批次,是否有可能催生同樣的工作的多個實例?我正在使用石英碎片?

回答

1

有可能與石英,使用MethodInvokingJobDetailFactoryBean,例如:

<bean id="myjob" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject"> 
     <ref bean="someBean" /> 
    </property> 
    <property name="targetMethod" value="someMethod" /> 
    <!-- The concurrent property is already true by default 
    <property name="concurrent" value="true" /> 
    --> 
</bean> 

援引Spring documentation

默認情況下,Quartz Jobs是無狀態的,導致工作與干擾的可能性彼此。如果您爲同一個JobDetail指定了兩個觸發器,則有可能在第一個作業完成之前,第二個作業將啓動。如果JobDetail類實現了有狀態接口,這不會發生。第二份工作在第一份工作完成之前不會開始。要使MethodInvokingJobDetailFactoryBean產生的作業不是併發的,請將併發標誌設置爲false。

+0

但我可以指定我需要使用多少線程? – user2434

2

在Spring批處理中,如果您爲每個jobLauncher.run()調用提供了不同的JobParameters,則可以啓動多個作業。 jobLauncher在Spring配置將產生每個作業在一個單獨的線程,如果它配置了相應的任務執行:

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

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" 
    p:corePoolSize="5" 
    p:maxPoolSize="30" /> 
相關問題