2011-08-17 201 views
2

我有一個問題,需要從MQ隊列接收一系列消息,並將其寫入文件並啓動一個包含文件作爲輸入的彈簧批處理作業。現在我正在考慮從MDB本身開始搭配@Autowired JobLauncher jobLauncher and @Autowired Job job;工作。但是我覺得這不是一個好的方法,因爲spring批處理可能會創建一系列線程,並且EJB不支持多線程。啓動Spring批處理作業

有沒有其他有效的方法來做到這一點?我不想使用石英調度程序或其他任何東西,因爲它增加了複雜性。在批處理文件進入目錄後不久,彈出批處理文件中會有任何界面提供工作嗎?任何導致這樣做更好的將不勝感激。

謝謝。

回答

9
  • 我有凡在我需要從MQ隊列中接收的一系列消息的,寫這一個文件,並啓動春季批處理作業與文件作爲輸入問題

一這樣做,這將是搞了一下Spring集成,在這裏你將有一個文件輪詢,那將輪詢新文件:

<file:inbound-channel-adapter id="filePoller" 
           channel="filesAreComing" 
           directory="file:${input.directory}" 
           filename-pattern="test*" /> 

適應file message(java.io.File中)到file name(字符串),因爲這是Spring Batch需要的。這可以用JobLauncher適配器來完成,這是已經可以從Spring Batch的聯繫here

@ServiceActivator 
public JobLaunchRequest adapt(File file) throws NoSuchJobException { 

    JobParameters jobParameters = new JobParametersBuilder().addString(
      "input.file", file.getAbsolutePath()).toJobParameters(); 

    return new JobLaunchRequest(job, jobParameters); 
} 

它換到一個JobLaunchRequest(這僅僅是一個JobJobParameters持有人),併發送該請求[作爲消息]到JobLaunchingMessageHandler

<service-activator input-channel="jobLauncher"> 
    <beans:bean class="org.springframework.batch.integration.launch.JobLaunchingMessageHandler"> 
     <beans:constructor-arg ref="jobLauncher" /> 
    </beans:bean> 
</service-activator> 

,將啓動作業。

「input.file」 是在運行時(因此#{...})約束的參數:

<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> 
    <property name="resource" value="#{jobParameters[input.file]}" /> 
    ... line mapper and other props 
</bean> 
+0

感謝您挖掘這個問題。我已經實現了你的建議(http://stackoverflow.com/questions/7152467/spring-serviceactivator - 即使這個問題已解決,只是我懶得更新答案)。不過謝謝你的努力。 – nobody

+2

感覺很棒幫助@nobody :) [當然,歡迎!] – tolitius

+0

服務激活器可能需要一個output-channel =「nullChannel」屬性來處理響應消息 –

0

我不確定我明白你爲什麼有一個消息隊列,一個消息驅動的POJO/EJB和一個批處理作業。

做到這一點的一種方法是讓消息驅動POJO/EJB來完成這項工作。這已經是一個異步的過程。您可以合併消息驅動的bean,以便有足夠的工人來處理負載。爲何增加複雜性?

如果你不想那樣做,忘記隊列並自己使用Spring Batch。我不會這樣做。

+1

你好,很抱歉這麼晚纔回復。我想利用彈簧的面向塊/分割/步驟特性,這不能直接使用MDB完成。假如我已經完成將輸入寫入物理磁盤上的文件,您能否告訴我如何啓動作業?如果我單獨使用春天,我該如何觸發這項工作? – nobody

相關問題