multithreading - Spring批处理多线程处理单个文件到多个文件

标签 multithreading spring spring-batch

我的问题陈述。读取一个有 1000 万条数据的 csv 文件并将其存储在 db 中。用尽可能少的时间。

我已经使用 java 的简单多线程执行器实现了它,逻辑几乎类似于 spring 批处理的块。从 csv 文件中读取预先配置的数据数量,然后创建一个线程,并将数据传递给验证数据的线程,然后写入在多线程中运行的文件。完成所有任务后,我将调用 sql loader 来加载每个文件。现在我想将此代码移至 spring 批处理(我是 spring 批处理的新手)

这是我的问题
1. 在任务中,是否可以使 ItemReader 到 Item writer 多线程(当我读取文件时,在线程写入数据之前创建一个新线程来处理数据)?如果不是,我需要创建两个步骤,第一步读取单线程文件,另一个步骤是多线程写入单个文件,但是如何将数据列表传递给上一个任务的另一个任务。
2. 如果单个线程出现故障,如何停止整个批处理作业。
3. 间隔一定时间后,如果失败,如何重试批处理作业。我知道在失败的情况下有重试选项,但我找不到在失败的情况下在一定时间间隔后重试任务的选项。在这里我不是在谈论调度程序,因为我已经在调度程序下运行了批处理作业,但是如果失败,它必须在 3 分钟后重新运行。

最佳答案

这是我解决问题的方法。

  • 使用缓冲和文件 channel 读写器(文件读/写的最快方式,甚至spring批处理使用相同的方式)读取文件并分块文件(拆分文件)。我实现了这样在作业开始之前执行(但是它可以使用作业作为使用方法调用程序的步骤来执行)
  • 以目录位置作为作业参数启 Action 业。
  • 使用 multiResourcePartitioner 将获取目录位置,并为每个文件在单独的线程中创建一个从属步骤
  • 在 Slave 步骤中获取从 Partitioner 传递过来的文件并使用 spring batchs itemreader 读取文件
  • 使用数据库项目编写器(我使用的是 mybatis 批处理项目编写器)将数据推送到数据库。
  • 最好使用等于提交计数的拆分计数。
  • 关于multithreading - Spring批处理多线程处理单个文件到多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672776/

    相关文章:

    c - 多个线程在没有锁的情况下递增共享变量但返回 "unexpected"输出

    c# - 线程安全的StreamWriter C#怎么做呢? 1个

    java - 使用 pageRequest 测试 spring 存储库

    maven - 从 Spring Roo 项目中提取域类

    c++ - std::unique_lock 移动语义

    multithreading - 如何将 Rendezvous 函数放入 jmeter 线程或用户中以实现特定函数

    启动tomcat加载servlet时出现java.lang.ClassCastException

    spring - 在 Spring Security 中自定义 CSRF 错误页面

    spring - Spring Batch-读取和处理多少条记录

    java - Spring 批处理 csv :Adding multiple headers to csv