前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Batch 小任务(Tasklet)步骤

Spring Batch 小任务(Tasklet)步骤

作者头像
HoneyMoose
发布于 2020-02-21 03:41:33
发布于 2020-02-21 03:41:33
9530
举报
文章被收录于专栏:CWIKIUSCWIKIUS

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM笔记-类加载机制
JVM 不和包括 Java 在内的任何语言绑定,它只与 "Class文件" 这种特定的二进制文件格式所关联。而 Class 文件也并非只能通过 Java 源文件编译生成,可以通过如下途径而来:
WriteOnRead
2020/03/30
5270
JVM笔记-类加载机制
深入理解Java类加载机制
其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。
李红
2019/05/29
4350
说说 JVM 的类加载机制『非专业』
类是在运行期间第一次使用时动态加载的,而不是一次性加载所有类。因为如果一次性加载,那么会占用很多的内存。
syy
2021/05/11
4320
jvm之类加载机制(五)
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、解析、和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制 懒加载
周杰伦本人
2022/10/25
1970
jvm之类加载机制(五)
JVM活学活用——类加载机制
类的实例化过程 ---- 有父类的情况 1. 加载父类静态     1.1 为静态属性分配存储空间并赋初始值     1.2 执行静态初始化块和静态初始化语句(从上至下) 2. 加载子类静态     2.1 为静态属性分配存储空间     2.2 执行静态初始化块和静态初始化语句(从上至下) 3. 加载父类非静态     3.1 为非静态块分配空间       3.2 执行非静态块 4. 加载子类非静态     4.1 为非静态块分配空间       4.2 执行非静态块 5. 加载父类构造器
Janti
2018/04/10
1.1K0
JVM活学活用——类加载机制
虚拟机类加载机制
在详细讲述类加载机制之前, 我们先了解一下JVM的内存结构图, 通过内存结构图,再理解类加载中的相关细节就会简单很多。
用户11097514
2024/05/31
1030
虚拟机类加载机制
37. 请你详细说说类加载流程,类加载机制及自定义类加载器
当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。
用户11332765
2024/11/01
1880
37. 请你详细说说类加载流程,类加载机制及自定义类加载器
虚拟机类加载机制
转载请注明原帖地址:http://www.cnblogs.com/dongxiao-yang/p/5369195.html
sanmutongzi
2020/03/04
2750
虚拟机类加载机制
4. JDK源码级别彻底剖析类加载机制
当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到 JVM。
源码之路
2021/03/02
4330
4. JDK源码级别彻底剖析类加载机制
跟小伟一起学习类加载机制
我们在学习 java 基础的时候,从宏观上了解了一个类到运行大致是:.java 文件通过 javac 编译器编译得到 .class 文件,在用到该类时,jvm 会加载该 class 文件,并创建对应的 class 对象,将 class 文件加载到 jvm 的内存当中,这个过程也被称之为类加载过程。
niceyoo
2020/05/26
3350
类加载
其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。
码农戏码
2021/03/23
5180
从JDK源码级别彻底刨析JVM类加载机制
“ 当我们用java命令运行某个类的main函数启动程序时,大家有没有想过是怎样加载的,本文将带着大家一起探讨JVM类的加载机制”
会呼吸的Coder
2022/06/13
2830
从JDK源码级别彻底刨析JVM类加载机制
类加载与 Java主类加载机制解析
类加载的最终结果便是在JVM的方法区创建一个与Java类对等的instanceKlass实例对象,但是在JVM创建完instanceKlass之后,又创建了与之对等的另一个镜像类——java.lang.Class。在JDK 6中,创建镜像类的逻辑被包含在instanceKlassKlass::allocate_instance_klass()函数中,在该函数的末尾执行 java_lang_Class::create_mirror()调用,该接口实现逻辑如下:
博文视点Broadview
2020/06/11
9750
类加载与 Java主类加载机制解析
JVM:第一章:类加载机制深度解析
加载 ----> 验证 ----> 准备 ----> 解析 ----> 初始化 ----> 使用 ----> 卸载
Java廖志伟
2021/02/02
7470
JVM:第一章:类加载机制深度解析
jvm类加载机制
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。
Leetcode名企之路
2018/11/29
5070
jvm类加载机制
JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
其中最核心的方法 loadClass ,其实现我们常说的双亲委派机制 ,我们后面展开。
小小工匠
2021/08/17
2800
类加载机制与对象的创建
查找并加载类的二进制数据加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情:
leobhao
2022/06/28
7230
类加载机制与对象的创建
虚拟机类加载机制
虚拟机把字节码文件从磁盘加载进内存的这个过程,我们可以粗糙的称之为「类加载」,因为「类加载」不仅仅是读取一段字节码文件那么简单,虚拟机还要进行必要的「验证」、「初始化」等操作,下文将一一叙述。
Single
2018/03/21
9913
虚拟机类加载机制
JVM类加载机制
虚拟机把描述类的数据从CLass文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制(懒加载)。
周三不加班
2019/09/03
5730
性能优化|全面剖析类加载机制
我们通过看启动器(Launch)构造方法里面的内容,来一探究竟 类加载器是如何初始化的
AI码师
2020/11/19
4250
性能优化|全面剖析类加载机制
相关推荐
JVM笔记-类加载机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档