0

我有一个使用 ItemProcessor 处理项目的 Spring Batch 应用程序。

@Component
@StepScope
public class MemberProcessor<T> implements ItemProcessor<T, Member> {

    @Override
    public Member process(T t) throws Exception {
        return processMember((UnprocessedMember) t);
    }
}

@Component
@StepScope
public class MemberWriter implements ItemWriter<Member> {

    @Override
    public void write(List<? extends Member> members) throws Exception {
        //store the members in db
        saveToDb(members);
    }
}

我想知道是否可以在处理项目后更新它,以便当它到达 ItemWriter 时,它会被更新。例如,我处理一个项目,然后我处理另一个可能需要编辑前一个项目的属性的项目。由于上一个项目尚未到达写入器,我无法对数据库进行更新,并且第一个项目在没有更新的情况下被写入

4

1 回答 1

0

Spring Batch 提供ItemProcesListener用于在 writer 处理项目之前处理项目。在将项目传递给 ItemProcessor 之前和之后以及处理器抛出任何异常的情况下,都会通知此接口的实现。所以基本上你需要创建一个自定义项目进程监听器来实现ItemProcesListener和注册处理器 setp 任务。例子:

public class MyCustomItemProcessListener implements ItemProcessListener<T, R> {

    @Override
    public void beforeProcess(T item) {
        System.out.println("MyCustomItemProcessListener - beforeProcess");
    }

    @Override
    public void afterProcess(T item, R result) {
        System.out.println("MyCustomItemProcessListener - afterProcess");
        // Apply your custom logic to act on the object before write
    }

    @Override
    public void onProcessError(T item, Exception e) {
        System.out.println("MyCustomItemProcessListener - onProcessError");
    }
}

现在您可以将侦听器添加到您的步骤中。这取决于您的步骤定义和配置。但基本上像下面这样。

StepBuilderFactory.get("Stepx")
...
.processor(someProcessor).listener(new MyCustomItemProcessListener())
...

或者

steps.get("stepx")
            .tasklet(new MyProcessorTask())
            .listener(new MyCustomItemProcessListener())
            .build();
于 2022-01-22T18:25:42.353 回答