文档章节

Spring Batch 小任务(Tasklet)步骤

honeymoose
 honeymoose
发布于 02/18 00:21
字数 995
阅读 329
收藏 0

3 月,跳不动了?>>>

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。

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 的接口。

如下面的示例代码:

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 配置

public Job taskletJob() {
     return this .jobBuilderFactory.get( "taskletJob" )
                 .start(deleteFilesInDir())
                 .build();
}
 
public Step deleteFilesInDir() {
     return this .stepBuilderFactory.get( "deleteFilesInDir" )
                 .tasklet(fileDeletingTasklet())
                 .build();
}
 
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

© 著作权归作者所有

honeymoose
粉丝 4
博文 591
码字总数 274719
作品 0
宝山
私信 提问
加载中

评论(0)

Spring Boot wwwxjf555888com 2.0 整合Spring15012038888 Batch Java配置示例

学习使用Java配置创建Spring批处理作业(具有多个步骤)。它使用Spring Boot 2,Spring batch 4和H2数据库来执行批处理作业。 项目结构 在这个项目中,我们将创建一个包含两步任务的简单作业...

1609146481873063
2019/01/03
0
0
Spring Batch管理平台

Spring Batch框架出现,降低了开发人员自行编写批处理框架的难度,同时,也让开发人员更加集中于业务逻辑的处理。但是,Spring Batch框架的掌握并非易事,主要集中在:1、技术资料太少;2、S...

我可梦
2016/04/11
197
0
Spring Batch_实现Tasklet

Spring Batch_实现Tasklet Chunk-oriented processing is not the only way to process in a Step. What if a Step must consist as a simple stored procedure call? You could implement ......

秋风醉了
2014/12/01
675
0
Spring Batch 之 Sample(Hello World)(三)

通过前面两篇关于Spring Batch文章的介绍,大家应该已经对Spring Batch有个初步的概念了。这篇文章,将通过一个”Hello World!”实例,和大家一起探讨关于Spring Batch的一些基本配置和实现...

长平狐
2012/08/27
862
0
Spring Batch(2)——Job配置与运行

在 Spring Batch(1)——数据批处理概念——数据批处理概念") 文中介绍了批处理的概念以及Spring Batch相关的使用场景,后续将会陆续说明在代码层面如何使用。 引入 Spring batch的引入非常简...

随风溜达的向日葵
2019/07/04
285
0

没有更多内容

加载失败,请刷新页面

加载更多

电脑录屏软件哪个好?轻松搞定屏幕录制的技巧

电脑录屏软件哪个好?在网上能找到不少有关电脑录屏的软件,且质量上也是参差不齐的。使用录屏工具时由于不知道录屏软件哪个好在录制视频经常会遇到各式各样的问题,不是录制后视频出现卡顿就...

cenfeng123
17分钟前
20
0
适用于Mac电脑的Python开发工具哪款好用?

适用于Mac电脑的Python开发工具哪款好用?WingPro 7 Mac版好用吗?wingpro mac破解版是一款跨平台 Python IDE 系列通过强大的集成编辑,调试,单元测试和项目管理功能,使Python开发变得更加...

mac小叮当
18分钟前
9
0
对于产品开发而言一些想法。

如果你在做一个产品,那么就尽量把这个产品打磨的用心些,除非只是给你自己用的工具,不会去出售或者提供服务的。 因为你前期如果不花时间去琢磨这些事情,那么后面产品不断的出现问题,所花...

开源中国最牛的人
20分钟前
28
0
电子音乐与传统音乐的区别

音乐有着悠久的历史,但电子音乐是随着现代科技发展而发展起来的,电子音乐是音乐创作结合计算机的技术,形成在计算机平台上发展的新音乐形式。这种音乐形式不是以传统的乐器为创作工具,而是...

奇亿音乐
26分钟前
18
0
Oracle创建设置查询权限用户

--普通用户test,需要创建查询用户(cxtest),授权test的部分表或试图查询权限 -- 使用 SYSTEM创建用户 create user cxtest  identified by cxtest  default tablespace USERS  te...

wzb88
30分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部