单个Java进程的排队/工作线程体系结构

时间:2012-10-23 18:48:56

标签: java multithreading queue jms message-queue

我有以下问题需要解决。

我需要编写一个java程序:

  1. 从Web服务读取JSON对象j1,j2,...,jn。
  2. 对每个对象进行一些数字运算以得出j1',j2',...,jn'
  3. 将对象j1',j2',...,jn'发送到Web服务。
  4. 步骤1,2和3的计算空间要求可以在任何给定时间变化。

    例如:

    1. 在步骤2处理JSON对象所花费的时间可能因JSON对象的内容而异。
    2. 步骤1中Web服务生成的对象的速率可随时间上升或下降。
    3. 步骤3中的消费网络服务可以积压。
    4. 要解决上述设计问题,需要实现以下架构:

      enter image description here

      1. 从外部Web服务中读取JSON对象并将它们放在Q
      2. 自动调整大小的工作线程池,它使用Q中的JSON对象并处理它们。处理完毕后,将生成的对象放在第二个Q
      3. 自动调整大小的工作线程池,它使用第二个Q中的JSON对象将它们发送到使用的Web服务。
      4. 问题:

          

        我很好奇是否有可以用来解决这个问题的框架?

        注意:

        1. 我可以使用一系列组件来解决这个问题,例如自定义队列,使用并发包的Threadpools - 但是我正在寻找一种允许编写这种解决方案的解决方案。
        2. 这不会存在于容器内。这将是一个Java进程,其入口点是public static void main(String args [])
        3. 但是,如果有一个适合这种范例的容器,我想了解它。
        4. 我可以把它分成多个进程,但是我想在一个过程中保持它非常简单。
        5. 感谢。

          感谢。

2 个答案:

答案 0 :(得分:1)

我不确定你的帖子的最终问题是什么,但你有一个合理的设计理念。我有一个问题是你在哪个环境?您是在JavaEE容器中还是只是一个简单的独立应用程序?

如果您在容器中,那么让Message Driven Beans处理JMS队列比处理工作线程池更有意义。

如果在您自己的容器中,您自己管理线程池会更有意义。话虽如此,我还会考虑运行单独的应用程序,将工作从队列中拉出来,从而为您带来更好的扩展架构。如果需要,你可以添加更多的机器,让更多的工人指向一个队列。

答案 1 :(得分:1)

尝试Apache camelSpring Integration来连接。这些是一种集成框架,可以简化您与Web服务的交互。您需要做的是从webservice 1定义路径 - >数字计算器 - > Web服务2.中间所需的路由和转换可由框架本身处理

你将你的cruncher实现为骆驼处理器。 并行化您的计算器可以通过SEDA实现; Camel有this pattern的组件。另一个替代方案是AsyncProcessor

我要说你先来看看像camel这样的框架背后的原理。他们创造的抽象与手头的问题非常相关。