日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

一篇文章教你学会使用SpringBatch 监听器Listener

發(fā)布時(shí)間:2025/1/21 javascript 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇文章教你学会使用SpringBatch 监听器Listener 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 一、SpringBatch監(jiān)聽(tīng)器
      • 二、搭建SpringBatch開(kāi)發(fā)環(huán)境
      • 三、監(jiān)聽(tīng)器詳細(xì)介紹
        • 1、JobExecutionListener
        • 2、StepExecutionListener
        • 3、ChunkListener
        • 4、ItemReaderListener
        • 5、ItemProcessListener
        • 6、ItemWriteListener
        • 7、SkipListener
      • 四、創(chuàng)建job執(zhí)行監(jiān)聽(tīng)器

寫(xiě)在前面: 我是「境里婆娑」。我還是從前那個(gè)少年,沒(méi)有一絲絲改變,時(shí)間只不過(guò)是考驗(yàn),種在心中信念絲毫未減,眼前這個(gè)少年,還是最初那張臉,面前再多艱險(xiǎn)不退卻。
寫(xiě)博客的目的就是分享給大家一起學(xué)習(xí)交流,如果您對(duì) Java感興趣,可以關(guān)注我,我們一起學(xué)習(xí)。

前言:為什么要寫(xiě)這篇文章,因?yàn)槲覀冊(cè)谟肧pringBatch做批量時(shí)候,經(jīng)常會(huì)在job執(zhí)行之前之后,或者step之前之后做一些特殊處理,或者程序報(bào)錯(cuò)我們要把報(bào)錯(cuò)的數(shù)據(jù)抓出來(lái)。這時(shí)候SpringBatch提供的監(jiān)聽(tīng)器可以很好的幫助我們解決這些問(wèn)題。下面就讓我們一步一步去研究SpringBatch監(jiān)聽(tīng)器吧。

一、SpringBatch監(jiān)聽(tīng)器

Spring Batch提供了多種監(jiān)聽(tīng)器Listener,用于在任務(wù)處理過(guò)程中觸發(fā)我們的邏輯代碼。常用的監(jiān)聽(tīng)器根據(jù)粒度從粗到細(xì)分別有:Job級(jí)別的監(jiān)聽(tīng)器JobExecutionListener、Step級(jí)別的監(jiān)聽(tīng)器StepExecutionListener、Chunk監(jiān)聽(tīng)器ChunkListener、ItemReader監(jiān)聽(tīng)器ItemReadListener、ItemWriter監(jiān)聽(tīng)器ItemWriteListener和ItemProcessor監(jiān)聽(tīng)器ItemProcessListener和SkipListener等。具體可以參考下表:

監(jiān)聽(tīng)器具體說(shuō)明
JobExecutionListener在Job開(kāi)始之前(beforeJob)和之后(aflerJob)觸發(fā)
StepExecutionListener在Step開(kāi)始之前(beforeStep)和之后(afterStep)觸發(fā)
ChunkListener在 Chunk 開(kāi)始之前(beforeChunk),之后(afterChunk)和錯(cuò)誤后(afterChunkError)觸發(fā)
ItemReadListener在 Read 開(kāi)始之前(beforeRead>,之后(afterRead)和錯(cuò)誤后(onReadError)觸發(fā)
ItemProcessListener在 Processor 開(kāi)始之前(beforeProcess),之后(afterProcess)和錯(cuò)誤后(onProcessError)觸發(fā)
ItemWriteListener在 Writer 開(kāi)始之前(beforeWrite),之后(afterWrite)和錯(cuò)誤后(onWriteError)觸發(fā)
SkipListener在 Skip(reder)時(shí)候,在 Skip(writer)時(shí)候,在 Skip(processor)時(shí)候

二、搭建SpringBatch開(kāi)發(fā)環(huán)境

新建一個(gè)Spring Boot項(xiàng)目,版本為2.3.1.RELEASE,引入SpringBatch jar包,項(xiàng)目結(jié)構(gòu)如下圖所示:
如果對(duì)怎么快速搭建SpringBoot功能有疑問(wèn),請(qǐng)看此篇文章:

一篇文章教你學(xué)會(huì)使用SpringBoot實(shí)現(xiàn)文件上傳和下載

三、監(jiān)聽(tīng)器詳細(xì)介紹

每種監(jiān)聽(tīng)器都可以通過(guò)兩種方式使用:

  • 接口實(shí)現(xiàn);
  • 注解驅(qū)動(dòng)。

1、JobExecutionListener

Job監(jiān)聽(tīng)器提供了兩個(gè)方法,一個(gè)是beforeJob(),另一個(gè)是afterJob()。這個(gè)監(jiān)聽(tīng)器我們可以做些參數(shù)的加載。比如在job執(zhí)行之前把參數(shù)加載進(jìn)去。在執(zhí)行之后把參數(shù)清除等操作。

@Component public class MyJobExecutionListener implements JobExecutionListener {@Overridepublic void beforeJob(JobExecution jobExecution) {System.out.println("job執(zhí)行之前做處理...");}@Overridepublic void afterJob(JobExecution jobExecution) {System.out.println("job執(zhí)行之后做處理...");} }

2、StepExecutionListener

step監(jiān)聽(tīng)器和job監(jiān)聽(tīng)器功能差不多,也有兩個(gè)方法beforeStep()和afterStep()。
afterStep()這個(gè)方法有返回值,可以設(shè)置step的執(zhí)行狀態(tài)。

@Component public class MyStepExecutionListener implements StepExecutionListener {@Overridepublic void beforeStep(StepExecution stepExecution) {System.out.println("step執(zhí)行之前...");}@Overridepublic ExitStatus afterStep(StepExecution stepExecution) {System.out.println("step執(zhí)行之后...");return null;} }

3、ChunkListener

ChunkListener有三個(gè)方法beforeChunk()、afterChunk()、afterChunkError()。都能把chunk的上下文打印出來(lái)。通過(guò)beforeChunk和afterChunk可以把一個(gè)chunk的執(zhí)行時(shí)間算出來(lái)。

@Component public class MyChunkListener implements ChunkListener {@Overridepublic void beforeChunk(ChunkContext chunkContext) {System.out.println("chunk執(zhí)行之前:" +System.currentTimeMillis());}@Overridepublic void afterChunk(ChunkContext chunkContext) {System.out.println("chunk執(zhí)行之后:" +System.currentTimeMillis());}@Overridepublic void afterChunkError(ChunkContext chunkContext) {System.out.println("chunk執(zhí)行出錯(cuò)...");} }

4、ItemReaderListener

reder監(jiān)聽(tīng)器也有三個(gè)方法beforeRead、afterRead、onReadError
如果我們讀到一條數(shù)據(jù),需要處理,可以在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報(bào)錯(cuò)...");} }

5、ItemProcessListener

Process監(jiān)聽(tīng)器也有三個(gè)方法,其實(shí)我們經(jīng)常用的是onProcessError這個(gè)方法,這個(gè)方法可以在處理process時(shí)候把異常數(shù)據(jù)打印出來(lái)。可以快速定位問(wèn)題。

@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報(bào)錯(cuò)...");} }

6、ItemWriteListener

特別注意的是onWriteError這個(gè)方法,是吧這個(gè)list所有對(duì)象全部打印出來(lái)。

@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監(jiān)聽(tīng)器可以處理RPW報(bào)異常的時(shí)候把這些數(shù)據(jù)跳過(guò)。

@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...");} }

四、創(chuàng)建job執(zhí)行監(jiān)聽(tīng)器

準(zhǔn)備好這些監(jiān)聽(tīng)器后,新建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;} }

上面代碼我們?cè)谙鄳?yīng)的位置配置了監(jiān)聽(tīng)器(配置chunk監(jiān)聽(tīng)器的時(shí)候,必須配置faultTolerant())。
啟動(dòng)項(xiàng)目,控制臺(tái)日志打印如下:

job執(zhí)行之前做處理... 2020-07-12 15:15:09.979 INFO 19104 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [listenerStep] step執(zhí)行之前... chunk執(zhí)行之前: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執(zhí)行之后:1594538110057 step執(zhí)行之后... 2020-07-12 15:15:10.068 INFO 19104 --- [ main] o.s.batch.core.step.AbstractStep : Step: [listenerStep] executed in 88ms job執(zhí)行之后做處理...

到此SpringBatch常用監(jiān)聽(tīng)器已經(jīng)全部介紹完畢。如果還有不明白的可以留言。

本文來(lái)源代碼: SpringBatch監(jiān)聽(tīng)器源碼
—————————————————————————————————
由于本人水平有限,難免有不足,懇請(qǐng)各位大佬不吝賜教!

總結(jié)

以上是生活随笔為你收集整理的一篇文章教你学会使用SpringBatch 监听器Listener的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。