Spring Batch - 多次在Reader中调用read()方法

时间:2015-05-06 02:23:30

标签: spring-batch

我试图多次在itemReader中实现调用read()方法。

例如:

我有一个POJO列表,其中我将有一个字符串变量,其值为A或B或C. 我必须根据字母顺序对此列表进行排序,并将其分为每个值的三个列表。即,值A的列表和值B的列表 并列出值C。

我需要逐个将每个列表发送到itemReader中的read()方法。

一旦处理和写入List,我就需要为B发送List等等..

这可行吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

虽然我对你想要达到的目标不是很清楚,但我认为没有任何理由不能做到。

我认为你的意思是: 1.您希望“项目”处理为具有相同ABC类型的 POJO的整个列表,或者 2.您希望该项目是POJO本身,并且您希望按ABC类型

的顺序处理它们

2是直截了当的。在第一次阅读时,准备所有POJO,对其进行排序。我认为他们是某种

在psuedo代码中,它看起来像这样

class MyReader implements ItemReader<MyPojo> {
    private List<MyPojo> values;
    MyPojo read() {
        if (values == null) {
             values = getPojos();
             sort values;
        }
        if (values.isEmpty()){
             return null;
        } else {
             return values.popFront();
        }
    }
}

1并不复杂。您需要在同一列表中将具有相同ABC类型的POJO分组,并逐个返回列表。使用TreeMap<String, List<MyPojo>>

可以轻松完成

在psuedo代码中,它看起来像这样

class MyReader implements ItemReader<List<MyPojo>> {  // note the item is List<MyPojo>
    private NavigableMap<String, List<MyPojo>> values;
    List<MyPojo> read() {
        if (values == null) {
             values = new TreeMap<>();
             pojos = getPojos();
             for (pojo : pojos) {
                 if (values do not contain pojo.abcType() ) {
                      values.put(pojo.abcType(), new ArrayList(pojo));
                 } else {
                      values.get(pojo.abcType()).add(pojo);
                 }
             }
        }
        if (values.isEmpty()){
             return null;
        } else {
             return values.popFirstEntry().value();
        }
    }
}

答案 1 :(得分:0)

如果您的商品清单完全可用(您的List<Pojo>已加载所有商品),您可以:

  1. 使用ListItemReader并注入有序列表
  2. 使用自定义ItemReader并在第一个ItemReader.read()
  3. 之后对项目进行排序

    关于break最好的方法是使用基于pojo'字符串变量'的自定义CompletionPolicy;通过这种方式,您的作者将收到一个列表,其中POJO的“字符串变量”对所有列表项具有相同的值(请查看How to read csv lines chunked by id-column with Spring-Batch?以获取示例代码)。