目标是提供 pdf 生成服务。该服务可通过简单的 servlet 获得。
假设该服务应该在多个负载平衡服务器(例如 Tomcat 实例)上运行,每个服务器都运行其手动创建的线程,这些线程会生成 PDF。每个请求都必须写入数据库,并且其 pdf 状态必须在整个过程中更新,例如:
- 一开始已排队
- 开始生成 pdf 时为“IN PROGRESS”
- 创建 pdf 后已处理
另一个假设是每个收到请求的 Tomcat 实例负责生成文档。整个解决方案必须在重新启动后保持不变,因此每个服务器实例都需要以某种方式存储其任务队列(例如在文件中?)。
人们可能认为整个过程可能与数据库同步,但恕我直言,轮询数据库以获取新的 PDF 请求可能非常耗时。
有什么想法、提示吗?
假设是灵活的,因此如果有人碰巧提出了一些好的假设之外的解决方案,请分享他/她的想法。
最佳答案
对于排队,请使用带有持久队列的消息总线,例如 RabbitMQ 或 ActiveMQ。
- 提供一个请求 Servlet,它将请求放入消息队列并在数据库中设置该请求的 QUEUED 状态。
- 使用监听器(无论是否在 Tomcat servlet 容器中)监听队列上的消息。
- 当监听器检测到新消息时,他们会将其拉下来并开始 PDF 生成,并在消息上设置 IN PROGRESS 状态。
- 当监听器完成处理后,它们会设置作业的“已处理”状态,确认消息以将其从队列中完全删除,然后继续处理下一个作业。
如果监听器在处理完消息之前死亡,则该消息将被取消确认并可供其他监听器处理。另一个监听器将拾取它,再次将状态设置为 IN PROGRESS,然后完成它。
关于java - 在多线程环境中生成 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311022/