如何在java

时间:2015-08-07 07:16:48

标签: java multithreading mongodb thread-safety queue

我们有一个基于Servlet的应用程序,可以上传文件。 上传的文件保存在服务器中,之后委托进行文件处理,然后插入我们的Mongo DB。

文件大于50 mbs,需要30m -1小时,具体取决于服务器负载。 当多个文件在不同的线程中一次处理时会出现问题,但它最终会使系统变慢,最后一个线程被中止,我们永远无法跟踪它。

因此,我们现在正在计划一个多生产者 - 基于单一消费者的方法,其中文件作业逐个排队,而消费者将逐个从队列中消耗它,但是按顺序排列。

如果我们需要稍后在应用程序中实现群集功能, 对于这种方法,我们计划实施以下流程。

  1. 当文件作业到来时,我们将把它放在状态为New的mongo集合中。
  2. 接下来它将立即调用消费者线程。
  3. 消费者将检查是否已经存在状态为"正在运行"
  4. 的正在运行的任务
  5. 如果没有运行状态,它将启动任务。
  6. 完成后,在结束之前,消费者将再次检查表,如果有任何状态为NEW的任务,如果有,则通过检查时间戳以及FIFO过程连续执行任务IN FIFO方式。
  7. 如果有当前正在运行的任务,则只需将新任务插入db。因为有一个已经在运行的消费者,该线程将负责插入到db中的新作业,而当前进程结束。
  8. 通过这种方式,我们还可以确保它在群集环境中平稳运行,而无需任何其他配置。

    有RabbitMQ或ActiveMQ的基于消息队列的解决方案,但我们需要最小化额外的组件配置

    让我知道我们的方法是否正确,或者我们是否有更好的解决方案。

    谢谢,

0 个答案:

没有答案