在多线程环境中生成PDF

时间:2014-01-23 14:31:06

标签: java concurrency jboss

目标是制作pdf生成服务。该服务可通过简单的servlet实现。

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

  • 首先排队
  • 在pdf生成开始时进行
  • 创建pdf后处理

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

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

任何想法,提示?

假设是灵活的,所以如果有人碰巧带有一些好的假设解决方案,请与他人分享他/她的想法。

1 个答案:

答案 0 :(得分:1)

对于排队,使用像RabbitMQ或ActiveMQ这样的消息总线和持久队列。

  1. 提供请求servlet,该请求将请求放在消息队列中,并在数据库中为请求设置QUEUED状态。
  2. 使用侦听器(在Tomcat servlet容器中)是否侦听队列中的消息。
  3. 当侦听器检测到新消息时,将其拉出并开始生成PDF,并在消息上设置IN PROGRESS状态。
  4. 当侦听器完成处理时,它们会在作业上设置PROCESSED状态,确认消息以将其从队列中完全删除,然后转到下一个。
  5. 如果侦听器在处理完消息之前死亡,则消息将被取消确认并可供其他侦听器处理。另一个听众会拿起它,再次将状态设置为IN PROGRESS,然后完成它。