我曾与seda一起工作并且直接阅读了文档。仍然无法想象seda的使用和直接。 vm对我来说是新的。请用一个例子解释一下。
答案 0 :(得分:16)
至少有四种不同的机制,一种Camel路由可以直接将数据传递给另一种。通过"直接"我的意思是不使用网络或某种形式的中间存储(文件,数据库)。可以根据它们是否可以在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:
。当然还有许多其他用例,但这些是常见的(根据我自己的经验主观)