【问题标题】:Spring Batch - Invoke read() method in Reader multiple timesSpring Batch - 在 Reader 中多次调用 read() 方法
【发布时间】:2015-05-06 02:23:29
【问题描述】:

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

例如:

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

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

一旦 A 的 List 被处理并写入,那么我需要发送 B 的 List 等等..

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

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    虽然我不太清楚您要达到的目标,但我看不出有什么理由无法做到。

    我假设您的意思是以下任何一种: 1. 您希望被处理的“项目”是具有相同 ABC 类型的 POJO 的完整列表,或者 2.你希望item是POJO本身,并且你希望它们按照ABC类型的顺序被处理

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

    在伪代码中是这样的

    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&lt;String, List&lt;MyPojo&gt;&gt;可以轻松完成

    在伪代码中是这样的

    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();
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您的项目列表完全可用(您有一个包含所有项目的 List&lt;Pojo&gt;),您可以:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-10
        • 2023-03-15
        • 2016-04-15
        • 1970-01-01
        • 2020-01-22
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多