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

Queuing / Worker Thread architecture for a single java process

我有以下问题要解决。

我需要编写一个Java程序:

  • 从Web服务读取json对象j1、j2、…、jn。
  • 对每个对象进行数字运算,得出j1'、j2'、…、jn'
  • 将对象j1'、j2'、…、jn'发送到Web服务。
  • 步骤1、2和3的计算空间要求在任何给定时间都可能发生变化。

    例如:

  • 在步骤2中处理JSON对象所需的时间可能因JSON对象的内容而异。
  • 步骤1中WebService生成对象的速率可以随时间上升或下降。
  • 步骤3中的消费Web服务可能会被回溯。
  • 要解决上述设计问题,需要实现以下体系结构:

    enter image description here

  • 从外部WebService读取JSON对象,并将其放置在Q上
  • 一个自动调整大小的工作线程池,使用Q中的JSON对象并处理它们。处理完后,将生成的对象放在第二个q上
  • 一个自动调整大小的工作线程池,使用第二个Q中的JSON对象将其发送到使用的WebService。
  • 问题:

    I am curious if there is framework which I can use to solve this problem?

    笔记:

  • 我可以使用一系列组件来解决这个问题,比如自定义队列、使用并发包的线程池——但是我正在寻找一个允许编写此类解决方案的解决方案。
  • 这不会住在集装箱里。这将是一个Java进程,其中入口点是公共静态空隙main(字符串ARGs[])。
  • 然而,如果有一个容器适合这个范例,我想了解它。
  • 我可以将其分为多个进程,但是我希望将其保持在一个简单的进程中。
  • 谢谢。

    谢谢。


    尝试使用ApacheCamel或Spring集成来连接。这些是一种集成框架,可以简化您与Web服务的交互。您需要做的是从WebService1->NumberCruncher->WebService2定义一个路由。之间所需的路由和转换可以由框架本身处理。

    您将把您的cruncher作为骆驼处理器来实现。平行化您的松脆机可以通过SEDA实现;骆驼有一个组件为这个模式。另一个替代方案是异步处理器

    我要说的是,首先看一下框架(如camel)背后的原则。他们创建的抽象与手头的问题非常相关。


    我不确定你的文章的最终问题是什么,但你有一个合理的设计概念。我有一个问题要问你,你在什么环境中?您是在一个Javaee容器中还是仅仅是一个简单的独立应用程序中?

    如果您在一个容器中,那么让消息驱动的bean从JMS队列中处理比拥有一个工作线程池更有意义。

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