如何在基于Java的Web应用程序中运行很长的进程?

时间:2017-03-10 16:59:33

标签: java jms spring-batch

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

  1. 从数据库中获取约3,00,000名用户的详细信息。
  2. 迭代他们。
  3. 使用itext为每个用户生成PDF文件。
  4. 将PDF文件保存在文件系统上。
  5. 更新已创建给定用户的PDF文件的数据库。
  6. 更新数据库中用户的PDF路径。
  7. 现在,整个过程可能需要很长时间。可能需要很多小时甚至可能是几天,因为它包括为每个用户创建pdf文件,然后是大量的数据库更新。

    此外,我需要在后台运行此过程,以便其他Web应用程序可以顺利运行。

    我正在考虑使用Spring Batch或Messaging Queue。还没有真正使用它们中的任何一个,所以不确定它们是否适用于此类问题,或者哪一个最适合这个问题。

    实施此类任务的理想方式是什么?

2 个答案:

答案 0 :(得分:0)

如果您无法为要求命名,您希望通过框架/库满意,您很可能不会需要一个......

生成PDF可能需要很多功能,您可能希望将此后台进程远离其自己的计算机上的主Web应用程序。

如果它是一个简单的Java过程,它通常更容易控制并在您的环境中移动它。

对我而言,这对于"普通" java - KISS。或者我错过了什么?

我确保用于从数据库中获取用户的Finder是

  • 可重新启动,即仅提取未处理的用户(如果由于发生狗屎而必须停止处理: - )
  • 分批运行以保持数据库往返并加载低
  • 是多线程的,即可以将用户分割为给定数量的线程(userid mod numberOfThreads,假设userId均匀分布),这样您就可以在必要时添加更多的机器/线程。

答案 1 :(得分:0)

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