使用ItemWriter有条件地将Spring批量写入不同的表(如果成功则将ItemProcessor输出到Table_A,如果失败则输出到Table_B)

时间:2013-02-12 12:38:51

标签: spring-batch

我正在从源表(使用JpaPagingItemReader)读取并传递给ItemProcessor。 我的要求是如果Item成功处理,那么它应该写入TABLE_A,如果处理失败,则写入TABLE_B。 我得到了它的工作,但我觉得它不是很好的方式。 我目前的实施是

// my processor
public class MyItemProcessor implements ItemProcessor<SourceEntity, BaseOutputEntity>{

    @Override
    public BaseOutputEntity process(SourceEntity input) {
       // NOTE: EntityA, EntityB both extend BaseOutputEntity
       try {
           EntityA a = callMyBusiness.method(input);
           return a;
       } catch (MyBusinessException e) {
           EntityB b = createMyFailureObj(input)
           return b;
       }
   }
}

// my itemwriter
public class MyItemWriter extends JpaItemWriter<MyBaseOutputEntity> {
    // donthing as JpaItemWriter methods will take care
}

它在功能上正是我想要的。 上面的一个缺点是,当我看到作业执行/步骤执行历史时,我不知道有多少是成功的或有多少是失败的,因为它表明例如如果100读取则写入100次。

任何人都可以提出更好的方法。条件步骤在这里有用吗?

1 个答案:

答案 0 :(得分:2)

您可以在处理器上抛出异常,并将此Exception声明为Skipable(如果不是,则会破坏chunck)。

如果实现ItemProcessListener,则可以捕获onProcessError(Entry item,Exception t)函数上的无效项,并将其写在表B上。 (仔细阅读文档:有些监听器功能是在事务处理,有些则不是)

在批处理结束时,writedItemsCount是valids项的数量,skippedItemCount是无效项的数量。

在不同的表中写入的其他方法是使用带有BackToBackPatternClassifier的ClassifierCompositeItemWriter,但是会丢失无效项的计数。