溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Batch中調(diào)用Tasklet接口的方法

發(fā)布時間:2020-05-29 16:34:47 來源:億速云 閱讀:278 作者:鴿子 欄目:編程語言

針對我們的實踐中,我們可以使用 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

TaskletAdapter

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;
}

Tasklet 實現(xiàn)(Implementation)示例

在主批量作業(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;
}

 

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI