javascript
一篇文章教你学会使用springbatch 监听器listener -凯发ag旗舰厅登录网址下载
文章目录
- 一、springbatch监听器
- 二、搭建springbatch开发环境
- 三、监听器详细介绍
- 1、jobexecutionlistener
- 2、stepexecutionlistener
- 3、chunklistener
- 4、itemreaderlistener
- 5、itemprocesslistener
- 6、itemwritelistener
- 7、skiplistener
- 四、创建job执行监听器
写在前面: 我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 java感兴趣,可以关注我,我们一起学习。
前言:为什么要写这篇文章,因为我们在用springbatch做批量时候,经常会在job执行之前之后,或者step之前之后做一些特殊处理,或者程序报错我们要把报错的数据抓出来。这时候springbatch提供的监听器可以很好的帮助我们解决这些问题。下面就让我们一步一步去研究springbatch监听器吧。
一、springbatch监听器
spring batch提供了多种监听器listener,用于在任务处理过程中触发我们的逻辑代码。常用的监听器根据粒度从粗到细分别有:job级别的监听器jobexecutionlistener、step级别的监听器stepexecutionlistener、chunk监听器chunklistener、itemreader监听器itemreadlistener、itemwriter监听器itemwritelistener和itemprocessor监听器itemprocesslistener和skiplistener等。具体可以参考下表:
监听器具体说明jobexecutionlistener | 在job开始之前(beforejob)和之后(aflerjob)触发 |
stepexecutionlistener | 在step开始之前(beforestep)和之后(afterstep)触发 |
chunklistener | 在 chunk 开始之前(beforechunk),之后(afterchunk)和错误后(afterchunkerror)触发 |
itemreadlistener | 在 read 开始之前(beforeread>,之后(afterread)和错误后(onreaderror)触发 |
itemprocesslistener | 在 processor 开始之前(beforeprocess),之后(afterprocess)和错误后(onprocesserror)触发 |
itemwritelistener | 在 writer 开始之前(beforewrite),之后(afterwrite)和错误后(onwriteerror)触发 |
skiplistener | 在 skip(reder)时候,在 skip(writer)时候,在 skip(processor)时候 |
二、搭建springbatch开发环境
新建一个spring boot项目,版本为2.3.1.release,引入springbatch jar包,项目结构如下图所示:
如果对怎么快速搭建springboot功能有疑问,请看此篇文章:
一篇文章教你学会使用springboot实现文件上传和下载
三、监听器详细介绍
每种监听器都可以通过两种方式使用:
- 接口实现;
- 注解驱动。
1、jobexecutionlistener
job监听器提供了两个方法,一个是beforejob(),另一个是afterjob()。这个监听器我们可以做些参数的加载。比如在job执行之前把参数加载进去。在执行之后把参数清除等操作。
@component public class myjobexecutionlistener implements jobexecutionlistener {@overridepublic void beforejob(jobexecution jobexecution) {system.out.println("job执行之前做处理...");}@overridepublic void afterjob(jobexecution jobexecution) {system.out.println("job执行之后做处理...");} }2、stepexecutionlistener
step监听器和job监听器功能差不多,也有两个方法beforestep()和afterstep()。
afterstep()这个方法有返回值,可以设置step的执行状态。
3、chunklistener
chunklistener有三个方法beforechunk()、afterchunk()、afterchunkerror()。都能把chunk的上下文打印出来。通过beforechunk和afterchunk可以把一个chunk的执行时间算出来。
@component public class mychunklistener implements chunklistener {@overridepublic void beforechunk(chunkcontext chunkcontext) {system.out.println("chunk执行之前:" system.currenttimemillis());}@overridepublic void afterchunk(chunkcontext chunkcontext) {system.out.println("chunk执行之后:" system.currenttimemillis());}@overridepublic void afterchunkerror(chunkcontext chunkcontext) {system.out.println("chunk执行出错...");} }4、itemreaderlistener
reder监听器也有三个方法beforeread、afterread、onreaderror
如果我们读到一条数据,需要处理,可以在afterreader之后做操作。
5、itemprocesslistener
process监听器也有三个方法,其实我们经常用的是onprocesserror这个方法,这个方法可以在处理process时候把异常数据打印出来。可以快速定位问题。
@component public class myitemprocesslistener implements itemprocesslistener {@overridepublic void beforeprocess(object o) {system.out.println("process之前...");}@overridepublic void afterprocess(object o, object o2) {system.out.println("process之h后...");}@overridepublic void onprocesserror(object o, exception e) {system.out.println("process报错...");} }6、itemwritelistener
特别注意的是onwriteerror这个方法,是吧这个list所有对象全部打印出来。
@component public class myitemwriterlistener implements itemwritelistener {@overridepublic void beforewrite(list list) {system.out.println("writer之前...");}@overridepublic void afterwrite(list list) {system.out.println("writer之后...");}@overridepublic void onwriteerror(exception e, list list) {system.out.println("writer异常...");} }7、skiplistener
skip监听器可以处理rpw报异常的时候把这些数据跳过。
@component public class myskiplistener implements skiplistener{@overridepublic void onskipinread(throwable throwable) {system.out.println("skip reader...");}@overridepublic void onskipinwrite(object o, throwable throwable) {system.out.println("skip write...");}@overridepublic void onskipinprocess(object o, throwable throwable) {system.out.println("skip process...");} }四、创建job执行监听器
准备好这些监听器后,新建job包,然后在该包下新建listenjobconfiguration:
/*** @author shuliangzhao* @title: listenjobconfiguration* @date 2020/7/12 14:55*/ @configuration @enablebatchprocessing public class listenjobconfiguration {@autowiredprivate jobbuilderfactory jobbuilderfactory;@autowiredprivate stepbuilderfactory stepbuilderfactory;@autowiredprivate myjobexecutionlistener myjobexecutionlistener;@autowiredprivate mystepexecutionlistener mystepexecutionlistener;@autowiredprivate mychunklistener mychunklistener;@autowiredprivate myitemreadlistener myitemreadlistener;@autowiredprivate myitemprocesslistener myitemprocesslistener;@autowiredprivate myitemwriterlistener myitemwriterlistener;@autowiredprivate myskiplistener myskiplistener;@beanpublic job listenerjob() {return jobbuilderfactory.get("listenerjob").listener(myjobexecutionlistener).start(listenerstep()).build();}@beanpublic step listenerstep() {return stepbuilderfactory.get("listenerstep").listener(mystepexecutionlistener).listener(mychunklistener).chunk(10).reader(reader()).listener(myitemreadlistener).processor(processor()).listener(myitemprocesslistener).writer(list -> list.foreach(system.out::println)).listener(myitemwriterlistener).listener(myskiplistener).build();}@bean@stepscopepublic itemreader<string> reader() {list<string> data = arrays.aslist("java", "c ", "javascript", "python");return new myitemreader(data);}@bean@stepscopepublic itemprocessor<string, string> processor() {return item -> item " language";} } public class myitemreader implements itemreader<string> {private iterator<string> iterator;public myitemreader(list<string> data) {this.iterator = data.iterator();}@overridepublic string read() {return iterator.hasnext() ? iterator.next() : null;} }上面代码我们在相应的位置配置了监听器(配置chunk监听器的时候,必须配置faulttolerant())。
启动项目,控制台日志打印如下:
到此springbatch常用监听器已经全部介绍完毕。如果还有不明白的可以留言。
本文来源代码: springbatch监听器源码
—————————————————————————————————
由于本人水平有限,难免有不足,恳请各位大佬不吝赐教!
总结
以上是凯发ag旗舰厅登录网址下载为你收集整理的一篇文章教你学会使用springbatch 监听器listener的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。
- 上一篇: 一篇文章教你学会使用springboot
- 下一篇: