2012-10-23 31 views
1

我有以下问题需要解决。单个java进程的排队/工作线程体系结构

我需要写一个java程序:

  1. 读取JSON对象J1,J2,...,JN从web服务。
  2. 对每个对象都进行一些处理以获得j1',j2',...,jn'
  3. 将对象j1',j2',...,jn'发送到Web服务。

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

例如:

  1. 它需要在步骤2处理JSON对象可以根据JSON对象的内容而变化的时间。
  2. 第1步中由webservice生成的对象的速率可随着时间上升或下降。
  3. 步骤3中的使用Web服务可能会积压。

为了解决上述方面的设计要求要实现以下结构:

enter image description here

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

问:

我很好奇,如果有框架,我可以用它来解决这个问题?

注:

  1. 我可以在此使用范围,如自定义队列组件的解决,线程池使用并发包 - 但是我正在寻找一个解决方案,允许这样的解决方案的写作。
  2. 这不会生活在一个容器内。这将是一个Java过程,入口点是公共静态无效的主要(字符串参数[])
  3. 但是,如果有一个容器适合这种范式,我想了解它。
  4. 我可以把它分成多个进程,但是我想在一个进程中保持它非常简单。

感谢。

谢谢。

+1

问题是? – home

+0

对不起......这一定是我累了的大脑。 – user1172468

+0

np,感谢您的更新! – home

回答

1

尝试Apache camelSpring Integration来连线。这些是一种集成框架,将减轻您与web服务的交互。你需要做的是从Web服务定义路线 1 - >算术达 - > Web服务2.路由之间可以通过框架本身

处理你实现你排排坐般地在所需的转换处理器。 并行您的cruncher可能通过SEDA;骆驼有一个组件this pattern。另一种替代方案是AsyncProcessor

我想说你首先看看像骆驼这样的框架背后的原理。他们创建的抽象与手头的问题非常相关。

+0

嗯,@ mzzzzb,你认为Twitter风暴会适合这个账单吗? – user1172468

+0

@ user1172468,我害怕我不知道Storm的事情。只是看着它,似乎很有趣,而不是建议。还有一件事要学习:) – mzzzzb

1

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

如果您位于容器中,那么使消息驱动Bean离开JMS队列处理比拥有工作线程池更有意义。

如果在您自己的容器中,自己管理线程池会更有意义。有了这个说法,我还会考虑让单独的应用程序运行,从队列中取出工作,这将为您带来更好的缩放体系结构。如果需求出现了,你可以添加更多的机器和更多的工作人员指向一个队列。

+0

非常感谢@Jeff我会根据您的输入编辑问题并对其进行优化,但基本上如下: 1.无容器2.要保持简单:单一过程 – user1172468

+1

据我所知,没有任何一站式商店框架,但你可以链接在一起。您可以使用诸如[Apache Axis](http://axis.apache.org/axis/)之类的框架来消费和推送到Web服务和[Apache Commons Pooling](http://commons.apache.org/)池/)为线程池和自动增长。 –