Spring batch Spring批处理-多次在读取器中调用read()方法

Spring batch Spring批处理-多次在读取器中调用read()方法,spring-batch,Spring Batch,我尝试在itemReader中多次调用read()方法 例如: 我有一个POJO列表,其中有一个字符串变量,值为a、B或C。 我必须根据字母顺序对这个列表进行排序,并将每个值分成三个列表。i、 e.值A的列表和值B的列表 和值C的列表 我需要将每个列表逐个发送到itemReader中的read()方法 一旦A的列表被处理并写入,那么我需要发送B的列表,依此类推 这可行吗?非常感谢您的帮助。虽然我不太清楚您想要实现什么目标,但我不认为有任何理由不能实现 我想你的意思是: 1.您希望流程中的“项”是

我尝试在itemReader中多次调用read()方法

例如:

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

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

一旦A的列表被处理并写入,那么我需要发送B的列表,依此类推


这可行吗?非常感谢您的帮助。

虽然我不太清楚您想要实现什么目标,但我不认为有任何理由不能实现

我想你的意思是: 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();
        }
    }
}
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();
        }
    }
}
MyReader类实现ItemReader{ 私有列表值; MyPojo read(){ 如果(值==null){ values=getPojos(); 排序值; } if(values.isEmpty()){ 返回null; }否则{ 返回值; } } } 没有比这更复杂的了。您需要将具有相同ABC类型的POJO分组到同一列表中,然后逐个返回列表。使用
TreeMap

在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();
        }
    }
}
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();
        }
    }
}
类MyReader实现ItemReader{//注意,该项是列表
私有导航地图值;
列表读取(){
如果(值==null){
值=新树映射();
pojos=getPojos();
用于(pojo:pojo){
if(值不包含pojo.abcType()){
value.put(pojo.abcType(),新的ArrayList(pojo));
}否则{
value.get(pojo.abcType()).add(pojo);
}
}
}
if(values.isEmpty()){
返回null;
}否则{
返回值.popFirstEntry().value();
}
}
}

如果您的项目列表完全可用(您有一个包含所有项目的
列表),您可以:

  • 使用并注入到有序列表中
  • 使用自定义的
    ItemReader
    并将项目排序在第一个
    ItemReader.read()之后
  • 关于break最好的方法是使用基于pojo的自定义“string variable”;通过这种方式,编写器将收到一个列表,其中POJO的“字符串变量”对所有列表项具有相同的值(检查示例代码)