2012-02-06 75 views
8

作为Apache Camel的新手,我最近查看了很长的组件列表,并偶然发现他们对SEDA queue组件的支持。普通队列vs SEDA队列

这个页面对我来说没什么意义,所以我做了一些关于术语“SEDA队列”的在线搜索,并得到了维基百科文章here

看完那篇文章之后,我无法分辨SEDA队列与普通“普通”队列之间的区别是什么!两者都采用通过使用异步队列来解耦系统的概念。

从文章中,“SEDA”听起来像一个架构,它由在每个组件之间放置一个队列组成。它是否正确?

但是,如果它只是一个架构,那么为什么“SEDA”队列是一个特殊的Apache Camel组件呢?

+3

SEDA意味着像ExecutorService(队列和线程池)那样附加到队列中的线程也许这就是它的意思。 – 2012-02-06 14:18:59

+0

我不知道这个问题是否被更新了文档,但它基本上是说在第一行中:“seda:组件提供异步SEDA行为,因此消息在BlockingQueue上交换,消费者被调用_in来自生产者的单独线程。“ – DavidS 2017-03-31 21:26:42

回答

4

SEDA队列就像一个普通队列(正如Peter上面说的,在Camel中他们有一个线程池作为组件的一部分与它们关联)。 SEDA是一个架构。 Camel中的SEDA组件在您的进程中使用内存中队列,并且它们是一个单独的组件,以便将它们与Apache驼峰中的其他队列组件(即JMS组件)区分开来。

1

SEDA提供单个骆驼路线内组件的解耦。或者在一个单独的过程中。 。这意味着它可以帮助你对其他组件进行异步调用......它是一种内存阻塞队列。 在另一方面JMS用于整个系统的解耦.. JMS将有涉及外部代理.. SEDA预订购刚刚创建从消费者组件

3

SEDA一个单独的线程是代表阶段性事件的首字母缩写驱动架构它被设计为一种机制来调节消息处理的不同阶段之间的流程。其思想是消除整个过程中消息输出的频繁程度,使其与输入相匹配,它允许enpoint的消费者线程将长时间运行的工作卸载到bakground中,从而释放消费者的消息从运输。 将交换传递给seda:endpoint时,它将放入BlockingQueue中。该列表存在于骆驼上下文中,这意味着只有那些位于相同上下文中的路由才能被这种类型的端点加入。该队列默认是无界的,尽管可以通过在消费者的URI上设置size属性来更改该队列。

默认情况下,分配给端点的单个线程会从列表中进行交换并通过路由处理它们。正如在前面的例子中所看到的,可以增加并发消费者的数量,以确保及时地从该列表中处理交换。

SEDA模式最适合处理InOnly消息,其中一条路由完成处理并交给另一个处理下一个阶段。当消息交换模式为InOut时,可以通过调用它来请求seda:endpoint的响应。

参考。 Apache Camel Developer's Cookbook