seda,vm和direct in camel之间有什么区别用一个例子来解释它

时间:2017-09-07 09:53:44

标签: java apache-camel

我曾与seda一起工作并且直接阅读了文档。仍然无法想象seda的使用和直接。 vm对我来说是新的。请用一个例子解释一下。

2 个答案:

答案 0 :(得分:16)

至少有四种不同的机制,一种Camel路由可以直接将数据传递给另一种。通过"直接"我的意思是不使用网络或某种形式的中间存储(文件,数据库)。可以根据它们是否可以在CamelContext实例之间传递数据以及它们是同步还是异步来对这些机制进行分组。

  • direct - 单个CamelContext,同步(块生成器)
  • SEDA - 单个CamelContext,异步(不阻止生产者)
  • VM - 多个CamelContext,异步(不阻止生产者)
  • direct-VM - 多个CamelContext,同步(块生成器)

直接和直接VM机制是同步的,因为生成端点阻塞直到消耗端点及其所有其他路由逻辑完成。 SEDA和VM机制都使用消费者上的线程池,这样生产者发出的每个请求都被分配给池中的一个线程。这允许消费者端点及其相关的路由逻辑独立于生产者行事。

在不同Camel上下文之间进行通信的情况下,都需要VM端点。在许多情况下,可以将路由组合到相同的CamelContext中。但是,出于模块化或不可能的原因,它有时可能是不可取的,因为某些应用程序框架就是如此。例如,我可能在库(或组件)中实现一些Camel路由逻辑,目的是让库被其他代码使用。为了完整,这个库可能会定义一个包含各种路由的自包含CamelContext。如果我想调用库中的Camel逻辑,我将需要使用VM或Direct-VM,因为直接和SEDA端点不包含在Camel上下文之间路由所需的逻辑。

答案 1 :(得分:4)

direct:seda:组件之间的区别在于第一个是同步的,第二个是异步的,带有队列。

实际的不同之处在于,对于发送同步消息,您必须等待路由完成,而对于异步消息,它必须等待"触发并忘记" - 您将它们放入队列并假定消费者将处理它们。您还可以拥有多个消费者(并行化)。

最后一个示例vm:也是异步的,但它也可以在同一个JVM中的不同camel上下文中调用路由。想象一下,应用程序1有一个驼峰上下文,而应用程序2有一个驼峰上下文,这样他们就可以相互通信。

编辑:

关于"什么时候使用" :

  • 使用direct:在驼峰上下文中的端点之间正常调用
  • 在需要并行化或队列时使用seda:,但不想使用jms:
  • 在应用程序之间调用时使用vm:

当然还有许多其他用例,但这些是常见的(根据我自己的经验主观)