我无法连接到具有SEDA队列的驼峰路由。在服务器端,我有以下配置:
<camel:route>
<camel:from uri="seda:input"/>
<camel:log message =">>>>>data is : ${body}"/>
<camel:inOnly uri="activemq:queue:TESTQUEUE"/>
</camel:route>
我正试图从这样的独立客户端点击这条路线:
public static void main(String[] args) {
CamelContext context = new DefaultCamelContext();
producer = context.createProducerTemplate();
producer.sendBody("seda:input","Hey");
}
但是我的制作人无法连接到seda队列。 无法打到我的路线排队。无法在我的bean属性中添加camelContext。我得到“bean类的无效属性'camelContext'”。如果我将正文发送到SEDA队列,则消息将在那里但不会发送到路径的下一个元素
答案 0 :(得分:5)
正如Petter建议的那样,您的客户端需要连接到定义SEDA路由的相同Camel Context。在您的示例中,您似乎正在创建新的DefaultCamelContext()并尝试将消息发送到路由在另一个背景下定义。
通常,我在Spring XML中定义Camel Context,然后将上下文注入到需要它的任何类中......
<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
<routeBuilder ref="myRouter"/>
</camelContext>
<bean id="myClient" class="com.mycompany.MyClient">
<property name="camelContext" ref="camelContext"/>
</bean>
然后,您的客户端代码只需要调用以下内容......
getCamelContext().createProducerTemplate().sendBody("seda:input","Hey");
也就是说,如果您的客户端代码不在同一个JVM中或者无法获取相同CamelContext的句柄,那么您的选择是使用JMS,REST,HTTP(或任何支持远程的camel component客户端接口)...而不是SEDA端点或周围。
例如,您可以使用HTTP端点(通过camel-jetty)封装对SEDA队列的访问权限,如此...
from("jetty:http://localhost:9001/input").to("seda:input");
答案 1 :(得分:1)
骆驼中的SEDA组件被称为异步内部通道。如果您需要将消息处理分离为多个线程并具有更具弹性的实现,这非常有用。
在您的示例中,您有一个activemq端点。从概念上讲,它将与SEDA组件完全相同,但具有更多的胎儿。我建议您使用activemq或其他协议进行与Camel通信的客户端。
也就是说,如果您的客户端在与Camel相同的Java应用程序中运行,并且您的客户端可以获取Camel上下文(这是我推荐的一般设计),您可以使用ProducerTemplates将消息发送到SEDA组件。查看VM组件,它与SEDA几乎相同,但可以在同一个VM中使用,而不是使用相同的Camel Context。How ProducerTemplate works.