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