如何在基于java的web应用程序中运行非常长的进程?

如何在基于java的web应用程序中运行非常长的进程?,java,jms,spring-batch,Java,Jms,Spring Batch,我需要在基于java的spring boot web应用程序中运行一个非常长的过程。该过程包括以下步骤 从数据库中获取大约30万用户的详细信息 迭代它们 使用itext为每个用户生成PDF文件 将PDF文件保存在文件系统上 更新已为给定用户创建PDF文件的数据库 更新数据库中用户的PDF路径 现在,整个过程可能需要很多时间。可能需要数小时甚至数天,因为它包括为每个用户创建pdf文件,然后进行大量数据库更新 此外,我需要在后台运行此过程,以便web应用程序的其余部分可以顺利运行 我正在考虑使用Sp

我需要在基于java的spring boot web应用程序中运行一个非常长的过程。该过程包括以下步骤

  • 从数据库中获取大约30万用户的详细信息
  • 迭代它们
  • 使用itext为每个用户生成PDF文件
  • 将PDF文件保存在文件系统上
  • 更新已为给定用户创建PDF文件的数据库
  • 更新数据库中用户的PDF路径
  • 现在,整个过程可能需要很多时间。可能需要数小时甚至数天,因为它包括为每个用户创建pdf文件,然后进行大量数据库更新

    此外,我需要在后台运行此过程,以便web应用程序的其余部分可以顺利运行

    我正在考虑使用Spring批处理或消息队列。我还没有真正使用过它们中的任何一个,所以不确定它们是否是解决此类问题的合适框架,或者这两个框架中哪一个最适合解决此类问题


    实现这类任务的理想方法是什么?

    如果你不能说出你希望框架/库满足的需求,那么你很可能不需要一个

    生成PDF可能需要很大的能量,您可能希望将此后台进程与您自己机器上的主web应用程序保持距离

    如果它是一个简单的java进程,则通常更易于控制和在您的环境中移动它

    对我来说,这看起来像是一个简单的java-KISS任务。还是我遗漏了什么

    我会确保用于从数据库获取用户的查找器是

    • 可重新启动,即仅获取未处理的用户(如果您因为狗屎发生而必须停止处理:-)
    • 分批运行,以保持db往返和低负载
    • 是多线程的,即可以将用户分成给定数量的线程(userid mod numberOfThreads,假设userid是均匀分布的),以便在必要时添加更多的机器/线程

    此过程应使用spring批处理。当用户按下按钮时,您将异步启动作业。然后它将在一个单独的线程中运行,并处理您的所有记录。可以从作业存储库获取作业的当前状态。弹簧批是为这种类型的加工而制造的

    你需要某种形式的日程安排吗?@Rodrigo Villalba Zayas scheduling?不是真的。在web应用程序中,UI上会有一个按钮,上面会显示启动进程,进程将启动。是否可以仅使用线程等而不使用spring批处理此应用程序?spring批处理非常好,因为它可以以内存高效且数据库友好的方式处理这样的作业,这些作业必须处理数百万条记录。它是内存高效的,因为它将您正在处理的记录划分为您可以指定大小的批。它是数据库友好型的,因为您没有长时间运行的事务,而且如果您正确地构建了作业,那么您的数据库事务应该只在更小的数据集上运行,而不是在整个作业正在处理的完整数据集上运行。