欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 前端技术 > javascript >内容正文

javascript

一篇文章教你学会使用springbatch 监听器listener -凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 javascript 17 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 一篇文章教你学会使用springbatch 监听器listener 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

      • 一、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的执行状态。

@component public class mystepexecutionlistener implements stepexecutionlistener {@overridepublic void beforestep(stepexecution stepexecution) {system.out.println("step执行之前...");}@overridepublic exitstatus afterstep(stepexecution stepexecution) {system.out.println("step执行之后...");return null;} }

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之后做操作。

@component public class myitemreadlistener implements itemreadlistener {@overridepublic void beforeread() {system.out.println("reder之前...");}@overridepublic void afterread(object o) {system.out.println("reder之后...");}@overridepublic void onreaderror(exception e) {system.out.println("reder报错...");} }

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())。
启动项目,控制台日志打印如下:

job执行之前做处理... 2020-07-12 15:15:09.979 info 19104 --- [ main] o.s.batch.core.job.simplestephandler : executing step: [listenerstep] step执行之前... chunk执行之前:1594538110015 reder之前... reder之后... reder之前... reder之后... reder之前... reder之后... reder之前... reder之后... reder之前... process之前... process之h后... process之前... process之h后... process之前... process之h后... process之前... process之h后... writer之前... java language c language javascript language python language writer之后... chunk执行之后:1594538110057 step执行之后... 2020-07-12 15:15:10.068 info 19104 --- [ main] o.s.batch.core.step.abstractstep : step: [listenerstep] executed in 88ms job执行之后做处理...

到此springbatch常用监听器已经全部介绍完毕。如果还有不明白的可以留言。

本文来源代码: springbatch监听器源码
—————————————————————————————————
由于本人水平有限,难免有不足,恳请各位大佬不吝赐教!

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的一篇文章教你学会使用springbatch 监听器listener的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

网站地图