91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Spring Batch中調用Tasklet接口的方法

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

針對我們的實踐中,我們可以使用 Tasklet 來執行一個 FTP 的任務。

將我們產生的中間文件上傳到不同的 FTP 服務器上,你可以在實現中指定不同的服務器配置參數,這樣更加有利于代碼的重用。

為了能夠創建一個 TaskletStep,Bean 需要傳遞一個 tasklet 方法到構造器(builder),這個 tasklet 方法需要實現 Tasklet 接口。

當你構建 TaskletStep 的時候不要調用 chunk

下面的示例代碼顯示了一個在 Step build 中構建一個簡單的 tasklet。

@Bean
public Step step1() {
    return this.stepBuilderFactory.get("step1")
                .tasklet(myTasklet())
                .build();
}

如果你的 tasklet 實現了 StepListener  接口的話,TaskletStep 將會自動將 tasklet 注冊成為一個 StepListener

TaskletAdapter

ItemReader ItemWriter 接口的 adapters一樣。Tasklet  接口包含的實現也允許能夠通過已經存在的類使用 TaskletAdapter 來將自己進行注冊。

例如,你希望使用一個已經存在的 DAO 來更新記錄集上的標記的時候,你可以使用 TaskletAdapter 來進行實現。

使用 TaskletAdapter  能夠讓你的 DAO 可以被 Spring Batch 的 TaskletStep 調用而不需要讓你的 DAO 都實現 Tasklet 的接口。

如下面的示例代碼:

@Bean
public MethodInvokingTaskletAdapter myTasklet() {
    MethodInvokingTaskletAdapter adapter = new MethodInvokingTaskletAdapter();
 
    adapter.setTargetObject(fooDao());
    adapter.setTargetMethod("updateFoo");
 
    return adapter;
}

Tasklet 實現(Implementation)示例

在主批量作業開始之前,可能需要很多其他的批量作業必須完成,這樣以便于主批量作業能夠獲得必要的資源和在完成后釋放資源或者進行清理。

例如我們遇到下面的使用場景,一個批量作業需要大量的對文件進行交互和使用,通常來說需要在文件被上傳到其他服務器上后刪除本地產生的臨時文件。

下面的示例就是一個 Tasklet 的實現,這個Tasklet 的實現能夠完成上面的交互要求(文件來自 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 處理程序實現了將給定目錄中的所有文件進行刪除。我們應該通知 execute  方法,這個 Tasklet 應該只被執行一次。

所有相關執行的操作需要在 Step 中進行設置,請參考下面有關這個 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問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南川市| 阿鲁科尔沁旗| 黔东| 韶关市| 东城区| 盐亭县| 台江县| 桐柏县| 忻州市| 定日县| 南平市| 策勒县| 镇江市| 新兴县| 哈巴河县| 荆门市| 康保县| 梁山县| 达尔| 巴林右旗| 巫溪县| 马龙县| 石河子市| 阳高县| 新营市| 北票市| 西丰县| 油尖旺区| 彭山县| 昭平县| 广丰县| 长岛县| 方山县| 疏勒县| 孝感市| 西青区| 平安县| 六安市| 云林县| 松原市| 四川省|