mysql - spring batch - 如何在应用程序运行时传递动态列表到 ListItemReader 将其存储到数据库中

标签 mysql spring spring-batch spring-data-jpa c3p0

我是 Spring-Batch 技术的新手,请帮助了解如何在应用程序运行时传递动态列表到 ListItemReader 并将其存储到 MySql DB。

例如。我从数据库中获取一些值并对获取的数据进行一些计算,然后准备一个列表和这个新列表以传递给 ListItemReader 并将其存储到数据库中。

感谢您的帮助。

最佳答案

下面是 ListItemWriter 和 ListItemReader 的自定义实现,它允许您定义 name 属性。此属性用作将列表存储在 JobExecutionContext 中的键。

根据您的情况,您可以执行 3 个步骤:

  1. JDBCReader > ListItemWriter
  2. 计算任务
  3. ListItemReader > JDBCWriter

如果您的tasklet需要获取列表,您可以使用与下面相同的方式(即读/写JobExecutionContext)。

读者:

public class CustomListItemReader<T> implements ItemReader<T>, StepExecutionListener {

    private String name;
    private List<T> list;

    @Override
    public T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {

        if (list != null && !list.isEmpty()) {
            return list.remove(0);
        }
        return null;
    }

    @Override
    public void beforeStep(StepExecution stepExecution) {
        list = (List<T>) stepExecution.getJobExecution().getExecutionContext().get(name);
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        return null;
    }

    public void setName(String name) {  
        this.name = name;
    }
}

作者:

public class CustomListItemWriter<T> implements ItemWriter<T>, StepExecutionListener {

    private String name;
    private List<T> list = new ArrayList<T>();

    @Override
    public void write(List<? extends T> items) throws Exception {
        for (T item : items) {
            list.add(item);
        }
    }

    @Override
    public void beforeStep(StepExecution stepExecution) {}

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        stepExecution.getJobExecution().getExecutionContext().put(name, list);
        return null;
    }

    public void setName(String name) {  
        this.name = name;
    }
}

关于mysql - spring batch - 如何在应用程序运行时传递动态列表到 ListItemReader 将其存储到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209655/

相关文章:

mysql - MariaDB的Maxscale(BinLog Server)可以用作不同mysql集群的binlog收集器吗?

php - 存储在数组中或使用多个数据库查询

php - mysql 和 mysqli 的问题

java - JPA Hibernate 子级的级联类型

java - 由 : org. hibernate.LazyInitializationException 引起:未能延迟初始化角色集合:

java - Gradle在编译时包含jar,但排除运行时

mysql - 查询中的 Count() 返回双倍值(12 而不是 6)

spring - 如何使用 spring writer 将 EBCDIC byte[] 写入文件?

schema - 不同模式中的 Spring 批处理表

java - Spring Batch - 当项目具有相互依赖性时如何设置 chunk > 1?