您好,登錄后才能下訂單哦!
針對我們的實踐中,我們可以使用 Tasklet 來執(zhí)行一個 FTP 的任務。
將我們產(chǎn)生的中間文件上傳到不同的 FTP 服務器上,你可以在實現(xiàn)中指定不同的服務器配置參數(shù),這樣更加有利于代碼的重用。
為了能夠創(chuàng)建一個 TaskletStep
,Bean 需要傳遞一個 tasklet 方法到構(gòu)造器(builder),這個 tasklet 方法需要實現(xiàn) Tasklet 接口。
當你構(gòu)建 TaskletStep 的時候不要調(diào)用 chunk
。
下面的示例代碼顯示了一個在 Step build 中構(gòu)建一個簡單的 tasklet。
@Bean public Step step1() { return this .stepBuilderFactory.get( "step1" ) .tasklet(myTasklet()) .build(); } |
如果你的 tasklet
實現(xiàn)了 StepListener
接口的話,TaskletStep
將會自動將 tasklet
注冊成為一個 StepListener
。
與 ItemReader
和 ItemWriter
接口的 adapters
一樣。Tasklet
接口包含的實現(xiàn)也允許能夠通過已經(jīng)存在的類使用 TaskletAdapter
來將自己進行注冊。
例如,你希望使用一個已經(jīng)存在的 DAO 來更新記錄集上的標記的時候,你可以使用 TaskletAdapter
來進行實現(xiàn)。
使用 TaskletAdapter
能夠讓你的 DAO 可以被 Spring Batch 的 TaskletStep
調(diào)用而不需要讓你的 DAO 都實現(xiàn) Tasklet 的接口。
如下面的示例代碼:
@Bean public MethodInvokingTaskletAdapter myTasklet() { MethodInvokingTaskletAdapter adapter = new MethodInvokingTaskletAdapter(); adapter.setTargetObject(fooDao()); adapter.setTargetMethod( "updateFoo" ); return adapter; } |
在主批量作業(yè)開始之前,可能需要很多其他的批量作業(yè)必須完成,這樣以便于主批量作業(yè)能夠獲得必要的資源和在完成后釋放資源或者進行清理。
例如我們遇到下面的使用場景,一個批量作業(yè)需要大量的對文件進行交互和使用,通常來說需要在文件被上傳到其他服務器上后刪除本地產(chǎn)生的臨時文件。
下面的示例就是一個 Tasklet 的實現(xiàn),這個Tasklet
的實現(xiàn)能夠完成上面的交互要求(文件來自 Spring Batch samples project 示例程序)。
public class FileDeletingTasklet implements Tasklet, InitializingBean { private Resource directory; public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { File dir = directory.getFile(); Assert.state(dir.isDirectory()); File[] files = dir.listFiles(); for ( int i = 0 ; i < files.length; i++) { boolean deleted = files[i].delete(); if (!deleted) { throw new UnexpectedJobExecutionException( "Could not delete file " + files[i].getPath()); } } return RepeatStatus.FINISHED; } public void setDirectoryResource(Resource directory) { this .directory = directory; } public void afterPropertiesSet() throws Exception { Assert.notNull(directory, "directory must be set" ); } } |
Tasklet
處理程序?qū)崿F(xiàn)了將給定目錄中的所有文件進行刪除。我們應該通知 execute
方法,這個 Tasklet 應該只被執(zhí)行一次。
所有相關(guān)執(zhí)行的操作需要在 Step
中進行設置,請參考下面有關(guān)這個 Tasklet
的設置:
Java 配置
@Bean public Job taskletJob() { return this .jobBuilderFactory.get( "taskletJob" ) .start(deleteFilesInDir()) .build(); } @Bean public Step deleteFilesInDir() { return this .stepBuilderFactory.get( "deleteFilesInDir" ) .tasklet(fileDeletingTasklet()) .build(); } @Bean public FileDeletingTasklet fileDeletingTasklet() { FileDeletingTasklet tasklet = new FileDeletingTasklet(); tasklet.setDirectoryResource( new FileSystemResource( "target/test-outputs/test-dir" )); return tasklet; } |
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。