java - 单个 java 进程的排队/工作线程架构

标签 java multithreading queue jms message-queue

我有以下问题需要解决。

我需要编写一个java程序:

  1. 从 Web 服务读取 JSON 对象 j1,j2,...,jn。
  2. 对每个对象进行一些数字运算,得出 j1',j2',...,jn'
  3. 将对象 j1',j2',...,jn' 发送到网络服务。

步骤 1,2 和 3 的计算和空间要求可能在任何给定时间发生变化。

例如:

  1. 第 2 步处理 JSON 对象所需的时间可能会有所不同,具体取决于 JSON 对象的内容。
  2. 第 1 步中网络服务生成对象的速率可能会随着时间的推移而上升或下降。
  3. 第 3 步中使用的 Web 服务可能会积压。

为了解决上述设计问题,需要实现以下架构:

enter image description here

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

问题:

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

注释:

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

谢谢。

谢谢。

最佳答案

尝试Apache camelSpring Integration把事情连接起来。这些是一种集成框架,将简化您与 Web 服务的交互。您需要做的是定义一条从 webservice 1 -> number cruncher -> web service 2 的路由。之间所需的路由和转换可以由框架本身处理

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

我建议你先看看camel这样的框架背后的原理。他们创建的抽象与当前的问题非常相关。

关于java - 单个 java 进程的排队/工作线程架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13037157/

相关文章:

java - 如何根据 Camel Exchange 的起源地进行不同的处理?

java - 在不同类上使用线程生成的值的最佳方法

c++ - C++在队列中查找某些元素

php - 关于排队系统的问题

java - 如何将 IOException 作为自定义运行时异常 Java 8 吞下

java - 带有 JSON : Not working 的 Spring 3.1 REST

c++ - 如何在另一个类中通知条件变量,C++

c - 如何使用链表正确实现队列

java - 使用 Hibernate 根据唯一键查找或插入

java - 在 RainBow 的每个弧线之间添加 1 秒的延迟