我试图多次在itemReader中实现调用read()方法。
例如:
我有一个POJO列表,其中我将有一个字符串变量,其值为A或B或C. 我必须根据字母顺序对此列表进行排序,并将其分为每个值的三个列表。即,值A的列表和值B的列表 并列出值C。
我需要逐个将每个列表发送到itemReader中的read()方法。
一旦处理和写入List,我就需要为B发送List等等..
这可行吗?任何帮助表示赞赏。
答案 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>
已加载所有商品),您可以:
ListItemReader
并注入有序列表ItemReader
并在第一个ItemReader.read()
关于break最好的方法是使用基于pojo'字符串变量'的自定义CompletionPolicy
;通过这种方式,您的作者将收到一个列表,其中POJO的“字符串变量”对所有列表项具有相同的值(请查看How to read csv lines chunked by id-column with Spring-Batch?以获取示例代码)。