java - 在多线程环境中生成 PDF

标签 java concurrency jboss

目标是提供 pdf 生成服务。该服务可通过简单的 servlet 获得。

假设该服务应该在多个负载平衡服务器(例如 Tomcat 实例)上运行,每个服务器都运行其手动创建的线程,这些线程会生成 PDF。每个请求都必须写入数据库,并且其 pdf 状态必须在整个过程中更新,例如:

  • 一开始已排队
  • 开始生成 pdf 时为“IN PROGRESS”
  • 创建 pdf 后已处理

另一个假设是每个收到请求的 Tomcat 实例负责生成文档。整个解决方案必须在重新启动后保持不变,因此每个服务器实例都需要以某种方式存储其任务队列(例如在文件中?)。

人们可能认为整个过程可能与数据库同步,但恕我直言,轮询数据库以获取新的 PDF 请求可能非常耗时。

有什么想法、提示吗?

假设是灵活的,因此如果有人碰巧提出了一些好的假设之外的解决方案,请分享他/她的想法。

最佳答案

对于排队,请使用带有持久队列的消息总线,例如 RabbitMQ 或 ActiveMQ。

  1. 提供一个请求 Servlet,它将请求放入消息队列并在数据库中设置该请求的 QUEUED 状态。
  2. 使用监听器(无论是否在 Tomcat servlet 容器中)监听队列上的消息。
  3. 当监听器检测到新消息时,他们会将其拉下来并开始 PDF 生成,并在消息上设置 IN PROGRESS 状态。
  4. 当监听器完成处理后,它们会设置作业的“已处理”状态,确认消息以将其从队列中完全删除,然后继续处理下一个作业。

如果监听器在处理完消息之前死亡,则该消息将被取消确认并可供其他监听器处理。另一个监听器将拾取它,再次将状态设置为 IN PROGRESS,然后完成它。

关于java - 在多线程环境中生成 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311022/

相关文章:

java - 如何通过Selenium点击超链接?

java - ConcurrentHashmap 同时进行写入和获取操作

java - jboss-deployment-struct.xml 中子部署 war 的通配符泛化排除?

java - 从 .bat 文件运行 jar 文件时调整控制台大小

java - Spock测试中是否可以有一个全局设置方法?

java - 使用套接字发送浮点值(从 Java 应用程序到 C#)

amazon-web-services - 增加 DynamoDB 中的分片数量以并行启动更多 lambda

java - 我应该更喜欢 ThreadLocalRandom 而不是 ThreadLocal<Random>?

java - JBOSS EAP 7.1连接oracle 12c数据库

java - 野蝇8与10之间的区别