Spring Batch 小任务(Tasklet)步骤

Chunk-Oriented Processing不是处理 step 的唯一方法。

考虑下面的一个场景,如果你仅仅需要调用一个存储过程,你可以在 ItemReader 中实现这个调用,然后在存储过程完成调用后返回 null。这种设计看起来不是那么自然也不是非常优美,因为你的批量设计中甚至都不需要实现 ItemWriter。针对这种情况,Spring Batch 为你提供了 TaskletStep 选项。

TaskletStep 是一个简单的接口,这个接口只需要实现一个方法execute,这个方法将会被TaskletStep多次重复的调用,直到这个方法返回 RepeatStatus.FINISHED 或者抛出异常来表示调用失败。

Tasklet 的每一次调用都会包含在事务中(Transaction)。Tasklet 的实现(implementors)可以调用一个存储过程,一个脚本或者一个简单的 SQL 更新脚本。

针对我们的实践中,我们可以使用 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;

}

https://www.cwiki.us/display/SpringBatchZH/TaskletStep

原文地址:https://www.cnblogs.com/huyuchengus/p/12324498.html

时间: 2024-08-06 13:27:23

Spring Batch 小任务(Tasklet)步骤的相关文章

spring batch(一):基础部分

spring batch(一):基础部分 博客分类: Spring java spring batch 官网: http://www.springsource.org/spring-batch 下载页面: http://static.springsource.org/spring-batch/downloads.html 文档: http://static.springsource.org/spring-batch/reference/index.html 数据库表格创建连接:DDL http:

【转】大数据批处理框架 Spring Batch全面解析

如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架构设计给予支撑:但批处理领域的框架确凤毛麟角.是时候和我们一起来了解下批处理的世界哪些优秀的框架和设计了,今天我将以Spring Batch为例,和大家一起探秘批处理的世界.初识批处理典型场景探秘领域模型及关键架构实现作业健壮性与扩展性批处理框架的不足与增强批处理典型业务场景对账是典型的批处理业务处

Spring Batch示例: 读取CSV文件并写入MySQL数据库

Spring Batch示例: 读取CSV文件并写入MySQL数据库 GitHub版本: https://github.com/kimmking/SpringBatchReferenceCN/blob/master/01_introduction/Spring_Batch_MySQL.md 原文链接: Reading and writing CVS files with Spring Batch and MySQL 原文作者: Steven Haines - 技术架构师 下载本教程的源代码: S

Spring Batch使用示例: 读取CSV文件并写入MySQL数据库

GitHub版本: https://github.com/kimmking/SpringBatchReferenceCN/blob/master/01_introduction/Spring_Batch_MySQL.md ------------ 编写批处理程序来处理GB级别数据量无疑是种海啸般难以面对的任务,但我们可以用Spring Batch将其拆解为小块小块的(chunk). Spring Batch 是Spring框架的一个模块,专门设计来对各种类型的文件进行批量处理. 本文先讲解一个简

Spring Batch 专题

如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架构设计给予支撑:但批处理领域的框架确凤毛麟角.是时候和我们一起来了解下批处理的世界哪些优秀的框架和设计了,今天我将以Spring Batch为例,和大家一起探秘批处理的世界. 初识批处理典型场景 探秘领域模型及关键架构 实现作业健壮性与扩展性 批处理框架的不足与增强 批处理典型业务场景 对账是典型的

spring batch批量处理框架

spring batch精选,一文吃透spring batch批量处理框架 前言碎语 批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.SpringBatch基于POJO和Spring框架,相当容易上手使用,让开发者很容易地访问和利用企业级服务.spring batch具有高可扩展性的框架,简单的批处理,复杂的大数据批处理作业都可以通过SpringBatch框架来实现. spring batch

陪你解读Spring Batch(二)带你入手Spring Batch

前言 说得多不如show code.上一章简单介绍了一下Spring Batch.本章将从头到尾搭建一套基于Spring Batch(2.1.9).Spring(3.0.5).mybatis(3.4.5).mysql.gradle的批处理简单应用来处理文件中大量交易数据的写入. 那么这里简单定义以下交易文件的格式,一个txnId交易Id,一个amt交易金额.一天比如有100w交易数据过来要落表.文件大概长这样,只是简单定义以下,实际开发肯定不会那么少. 因工作需求没有使用最新版本的Spring

Spring Batch实践

Spring Batch在大型企业中的最佳实践 在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是"批处理". 批处理应用通常有以下特点: 数据量大,从数万到数百万甚至上亿不等: 整个过程全部自动化,并预留一定接口进行自定义配置: 这样的应用通常是周期性运行,比如按日.周.月运行: 对数据处理的准确性要求高,并且需要容错机制.回滚机制.完善的日志监控

初探Spring Batch

此系列博客皆为阅读<Pro Spring Batch>一书的读书笔记: 为什么我们需要批处理? 我们不会总是想要立即得到需要的信息,批处理允许我们在请求处理之前就一个既定的流程开始搜集信息:比如说一个银行对账单,我们可以按月生成,并在用户查询之前开启一个批处理流程进行处理: 有时候它能让生意做得更好:比如说在线购物时,并不是说你买了一个产品零售商就立即发货,而是四五个小时后,统一发货: 更好的利用资源:让应该利用的处理能力闲置起来是一个大的浪费,我们可以定制处理让一个机器一个接一个的运行Job