如何在 ItemWriteListener 实现的类中获取作业名称或步骤名称

问题描述 投票:0回答:1

这是我的实现,我想打印作业名称或步骤名称以及错误消息。 我该怎么做?

public class WriterListener implements ItemWriteListener {

    private static final PlatformLogger logger = PlatformLogger.getLogger(WriterListener.class);

    @Override
    public void beforeWrite(List list) {

    }

    @Override
    public void afterWrite(List list) {

    }

    @Override
    public void onWriteError(Exception e, List list) {
        logger.error("Exception occurred while writing {}", Arrays.toString(list.toArray()), e);
    }
}
java spring-batch
1个回答
1
投票

您可以使用步骤范围侦听器并在其中注入作业/步骤名称。这是一个简单的例子:

public class WriterListener implements ItemWriteListener {


    private static final PlatformLogger logger = PlatformLogger.getLogger(WriterListener.class);

    private String stepName;

    public WriterListener(String stepName) {
        stepName = stepName;
    }

    @Override
    public void beforeWrite(List list) {

    }

    @Override
    public void afterWrite(List list) {

    }

    @Override
    public void onWriteError(Exception e, List list) {

        // use this.stepName in the log message here
        logger.error("Exception occurred while writing {}", Arrays.toString(list.toArray()), e);
    }
}

您可以将侦听器声明为作用域 bean,如下所示:

@Bean
@StepScope
public WriterListener writerListener(@Value("#{stepExecution.stepName}") String stepName) {
    return new WriterListener(stepName);
}

完成此操作后,您可以在步骤中注册监听器,如下所示:

@Bean
public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
    return jobs.get("job")
            .start(steps.get("step")
                    .<Integer, Integer>chunk(5)
                    .reader(itemReader())
                    .processor(itemProcessor())
                    .writer(itemWriter())
                    .listener(writerListener(null))
                    .build())
            .build();
}
© www.soinside.com 2019 - 2024. All rights reserved.