连接到Camel-SEDA队列

Him*_*dav 1 java apache-camel

我无法连接到具有SEDA队列的驼峰路由.在服务器端我有以下配置:

<camel:route>
            <camel:from uri="seda:input"/>
            <camel:log  message =">>>>>data is : ${body}"/>
            <camel:inOnly uri="activemq:queue:TESTQUEUE"/>
        </camel:route>
Run Code Online (Sandbox Code Playgroud)

我试图从像这样的独立客户端这条路线:

public static void main(String[] args) {

        CamelContext context = new DefaultCamelContext();
        producer = context.createProducerTemplate();
            producer.sendBody("seda:input","Hey");

}
Run Code Online (Sandbox Code Playgroud)

但我的生产者无法连接到seda队列.无法打到我的路线排队.无法在我的bean属性中添加camelContext.我得到"bean类的无效属性'camelContext'".如果我将正文发送到SEDA队列,则消息将转到那里,但不会发送到溃败的下一个元素

Ben*_*Day 5

正如Petter建议的那样,您的客户端需要连接到定义SEDA路由的相同Camel上下文.在您的示例中,您似乎正在创建新的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>
Run Code Online (Sandbox Code Playgroud)

然后,您的客户端代码只需要调用以下内容...

getCamelContext().createProducerTemplate().sendBody("seda:input","Hey");
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您的客户端代码不在同一个JVM中或者无法获取相同CamelContext的句柄,那么您的选择是使用JMS,REST,HTTP(或任何支持远程客户端接口的Camel 组件)......而不是或围绕SEDA端点.

例如,你可以用这样的HTTP端点(通过camel-jetty)封装对SEDA队列的访问...

from("jetty:http://localhost:9001/input").to("seda:input");
Run Code Online (Sandbox Code Playgroud)