2015-09-09 47 views
2

是否可以在沒有XML的情況下爲作業設置Spring Batch?動態創建不帶XML的Spring批處理作業

目前,有很多XML定義的那些工作豆:

<bean id="sampleJob" class="com.test.job.TestJob"> 
    <property name="idBase" value="SampleId" /> 
    <property name="targetTableName" value="SAMPLE_TABLE" /> 
    <property name="sql"> 
     <value><![CDATA[ 
     SELECT 42 FROM 1337 
     ]]></value> 
    </property> 
</bean> 

Spring Batch的,每天晚上在我們的應用程序運行。我想讓編輯作業的屬性成爲可能。這個想法是從數據庫中獲取注入的屬性,而不是用XML對它們進行硬編碼。

請告訴我,如果你有更好的主意如何解決問題。目前,我想實現一種工廠,它提供了這樣一種方法:

public TestJob createJob(String name) { 
    String sql = db.getSqlFor(name); 
    String table = db.getTableFor(name); 
    ... 
    return new TestJob(sql, table, ...); 
} 

Spring Batch是否提供這些可能性?我GOOGLE了很多,但沒有找到一個令人滿意的解決方案。

在此先感謝!

+0

是的。你看過http://projects.spring.io/spring-batch/#quick-start嗎? – reto

+1

是的,我做到了。但是,我不清楚如何處理該用例的動態。作業信息將從數據庫中連續讀取,並且我希望在運行時創建動態作業,但不清楚會有多少作業。 – logineimer

回答

1

這是可能的。只需使用SpringBatch提供的不同構建器即可動態創建您的作業。

的步驟和所有的讀者和作家,他們用不用是春天豆(當然,還會有在這種情況下不能使用自動裝配,這迫使你這樣做你自己)。

@Configuration 
public class SimpleJobConfiguration { 
    private static final String JOB_NAME = "SimpleTestJob"; 

    @Autowired 
    private JobBuilderFactory jobs; 

    @Autowired 
    private StepBuilderFactory steps; 


    @Bean 
    public Job job() throws Exception { 
     SimpleJobBuilder jobBuilder = this.jobs.get(createJobName(JOB_NAME)).start(firstStep()); 

     for ... { 
      jobBuilder.next(createAStep(... params ...)); 
     } 

     return standardJob.build(); 
    } 

    public Step createAStep(String name, ... needed parameters ...) throws Exception { 
     StepBuilder stepBuilder = this.steps.get(name); 

     build your step 

     return standardStep1.build(); 
    } 
} 
+0

那麼,你只能用不同的步驟創建一個工作?目前,我們定義了一組執行一步的作業。 – logineimer

+1

是的。我想實現一個工作和splitflow在每個表都有自己的步驟中使用。據我瞭解,這些步驟將完全上獨立,所以,如果你提供一個AsyncTaskExecutor到splitflow,他們甚至會並行運行。注意:您也可以爲每個表創建一個作業,並將其作爲「JobStep」添加到splitflow。這將導致執行幾項「次級工作」的主要工作。 –

相關問題