使用弹簧批量中的自定义项目阅读器从数据库返回列表

时间:2018-04-06 17:06:37

标签: spring-batch

我有一个自定义项目阅读器来返回表格中的记录列表。我的作业在无限循环中运行,因为没有达到读者合同。有关这个的任何建议吗?

package com.example.ctuser1.myapplication;

import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.SOURCE)
public @interface Widget {
}

2 个答案:

答案 0 :(得分:0)

你的名单永远不会改变。假设您读取了大小为5的列表,则返回语句将始终返回相同的列表。您ItemReader的逻辑看起来只想返回一个列表(也就是对read()方法的一次调用)。

答案 1 :(得分:0)

根据Spring Batch Reader合同,您的方法将一次又一次地被调用,直到它返回null。在您的代码中,如果customDao成功,您的列表将始终为相同大小,它将永远不会为零。你需要一些条件来摆脱那个循环并返回null。这是一个可能的解决方案,通过使用一个名为index的变量来打破这个循环。

另一方面,我看到迈克回答了你的问题,我从他的书和视频本身中学到了春季批次:)

public class customReader implements ItemReader<List<T>> {


private static List<T> CCTransDlyLg = null;
@Autowired
customDao customDao;
private int index = 0;

@Override
public List<T> read() throws Exception {
    if (CCTransDlyLg == null || (CCTransDlyLg != null && CCTransDlyLg.size() == 0)) {
        CCTransDlyLg = customDao.getList();
        index = CCTransDlyLg.size() + 1;
    }
    log.info("CCTransDlyLg List:" + CCTransDlyLg.size());
    return index > CCTransDlyLg.size() ? null : CCTransDlyLg;

}