Java 如何在spring批处理中组合多个侦听器(步骤、读取、处理、写入和跳过)

Java 如何在spring批处理中组合多个侦听器(步骤、读取、处理、写入和跳过),java,spring,spring-batch,Java,Spring,Spring Batch,此操作的目的是通过多个步骤跟踪spring批处理作业中正在读取/处理/写入的行或项 我创建了一个实现这些接口的侦听器:StepExecutionListener、SkipPolicy、ItemReadListener、ItemProcessListener、ItemWriteListener @组件 公共类GenericListener实现StepExecutionListener、SkipPolicy、ItemReadListener、ItemProcessListener、ItemWrite

此操作的目的是通过多个步骤跟踪spring批处理作业中正在读取/处理/写入的行或项

我创建了一个实现这些接口的侦听器:
StepExecutionListener、SkipPolicy、ItemReadListener、ItemProcessListener、ItemWriteListener

@组件
公共类GenericListener实现StepExecutionListener、SkipPolicy、ItemReadListener、ItemProcessListener、ItemWriteListener{
私有日志记录器=LogFactory.getLog(getClass());
私人作业执行作业执行;
私有整数numeroProcess=0;
私有int currentReadIndex=0;
private int currentProcessIndex=0;
private int currentWriteIndex=0;
@凌驾
public void beforeRead()引发异常{
log.info(String.format(“[read][line:%s]”,currentReadIndex));
currentReadIndex++;
}
@凌驾
public void afterRead(对象o)引发异常{
日志信息(“对齐正确”);
}
@凌驾
public void onReadError(异常e)引发异常{
jobExecution.stop();
}
@凌驾
公共布尔值shouldSkip(Throwable Throwable,int i)抛出SkipLimitExceedeException{
String err=String.format(“Erreur a la ligne%s | message%s | cause%s | stacktrace%s”,numeroProcess,throwable.getMessage(),throwable.getCause().getMessage(),throwable.getCause().getStackTrace());
日志错误(err);
返回true;
}
@凌驾
预处理前公共无效(对象o){
log.debug(String.format(“[process:%s][%s][Object:%s]”,numeroProcess++,o.getClass(),o.toString());
currentProcessIndex++;
}
@凌驾
公共无效后处理(对象o,对象o2){}
@凌驾
public void onProcessError(对象o,异常e){
String err=String.format(“[ProcessError at%s][Object%s][Exception%s][Trace%s]”,currentProcessIndex,o.toString(),e.getMessage(),e.getStackTrace());
日志错误(err);
jobExecution.stop();
}
@凌驾
写前公共作废(列表){
log.info(String.format(“[write][chunk number:%s][current chunk size%s]”,currentWriteIndex,list!=null?list.size():0));
currentWriteIndex++;
}
@凌驾
公共空后写(列表){}
@凌驾
公共无效onWriteError(例外e,列表){
jobExecution.stop();
}
@凌驾
预处理前的公共无效(步骤执行步骤执行){
jobExecution=stepExecution.getJobExecution();
currentReadIndex=0;
currentProcessIndex=0;
currentWriteIndex=0;
}
@凌驾
公共出口状态后步骤(步骤执行步骤执行){
返回null;
}
}
作业定义(
CustomJobListener
是一个简单的类,它扩展了
JobExecutionListenerSupport

公共类批处理配置{
@自动连线
公共工作建筑工厂工作;
@豆子
公共作业作业(CustomJobListener侦听器,
@限定符(“步骤1”)步骤1,
@限定符(“步骤2”)步骤2,
@限定符(“步骤3”)步骤3){
return jobs.get(“SimpleJobName”)
.incrementer(新的RunIdIncrementer())
.防止重新启动()
.listener(侦听器)
.开始(步骤1)
.下一步(第2步)
.下一步(步骤3)
.build();
}
}
步骤定义(所有三个步骤都有相同的定义,只有读/处理器/写入器更改)

@组件
公共类StepControlFormat{
@自动连线
私人StepOneReader阅读器;
@自动连线
专用单处理器;
@自动连线
私人继作家;
@自动连线
私有配置访问配置访问;
@自动连线
私有泛型侦听器;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@豆子
@工作范围
@限定词(“步骤1”)
公共步骤stepOne()引发StepException{
返回stepBuilderFactory.get(“step1”)
.chunk(configAccess.getChunkSize())

.listener((ItemProcessListener多亏了Michael Minella的提示,我才解决了这个问题:

@Bean
@工作范围
@限定词(“步骤1”)
公共步骤stepOne()引发StepException{
SimpleTestBuilder builder=stepBuilderFactory.get(“step1”)
.chunk(configAccess.getChunkSize())
//为读/处理/写设置侦听器

.listener((ItemProcessListener多亏了Michael Minella的提示,我才解决了这个问题:

@Bean
@工作范围
@限定词(“步骤1”)
公共步骤stepOne()引发StepException{
SimpleTestBuilder builder=stepBuilderFactory.get(“step1”)
.chunk(configAccess.getChunkSize())
//为读/处理/写设置侦听器

.listener((ItemProcessListener可以按如下方式添加其他步骤侦听器

@Bean(name = STEP1)
public Step rpcbcStep() {
    
    SimpleStepBuilder<Employee, Employee> builder = stepBuilderFactory.get(STEP1).<Employee, Employee>chunk(100)
            .reader(step1BackgroundReader())
            .processor(processor())
            .writer(writer());
            
    builder.listener(step1BackgroundStepListener)
    builder.listener(step1BackgroundStepListener2);
    // add any other listeners needed
    
    return builder.build();
}
@Bean(name=STEP1)
公共步骤rpcbcStep(){
SimpleTestBuilder builder=stepBuilderFactory.get(STEP1.chunk)(100)
.reader(step1BackgroundReader())
.processor(处理器())
.writer(writer());
builder.listener(step1BackgroundStepListener)
监听器(step1BackgroundStepListener2);
//添加所需的任何其他侦听器
返回builder.build();
}

可以按如下方式添加其他步骤侦听器

@Bean(name = STEP1)
public Step rpcbcStep() {
    
    SimpleStepBuilder<Employee, Employee> builder = stepBuilderFactory.get(STEP1).<Employee, Employee>chunk(100)
            .reader(step1BackgroundReader())
            .processor(processor())
            .writer(writer());
            
    builder.listener(step1BackgroundStepListener)
    builder.listener(step1BackgroundStepListener2);
    // add any other listeners needed
    
    return builder.build();
}
@Bean(name=STEP1)
公共步骤rpcbcStep(){
SimpleTestBuilder builder=stepBuilderFactory.get(STEP1.chunk)(100)
.reader(step1BackgroundReader())
.processor(处理器())
.writer(writer());
builder.listener(step1BackgroundStepListener)
监听器(step1BackgroundStepListener2);
//添加所需的任何其他侦听器
返回bu