1

我无法连接到具有 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 队列,则消息将发送到那里,但不会发送到路由的下一个元素

4

2 回答 2

5

正如 Petter 建议的那样,您的客户端需要连接到定义 SEDA 路由的同一个 Camel 上下文。在您的示例中,您似乎正在创建一个新的 DefaultCamelContext() 并尝试将消息发送到定义的路由在另一种情况下。

通常,我在 Spring XML 中定义 Camel 上下文,然后将上下文注入到任何需要它的类中......

<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(或任何支持远程客户端接口的骆驼组件)...代替或围绕 SEDA 端点。

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

from("jetty:http://localhost:9001/input").to("seda:input");
于 2012-05-07T03:21:57.000 回答
1

Camel 中的 SEDA 组件被定义为异步内部通道。如果您需要将消息处理解耦为多个线程并具有更灵活的实现,这将非常有用。

在您的示例中,您有一个 activemq 端点。从概念上讲,它与 SEDA 组件几乎相同,但功能更多。我建议您使用 activemq 或其他协议来与 Camel 通信的客户端。

也就是说,如果您的客户端与 Camel 在同一个 Java 应用程序中运行,并且您的客户端可以获取 Camel 上下文(我通常建议反对这种设计),您可以使用 ProducerTemplates 向 SEDA 组件发送消息。查看 VM 组件,它与 SEDA 几乎相同,但可以在同一个 VM 中使用,而不是在同一个 Camel Context 中使用。ProducerTemplate 的工作原理。

于 2012-05-05T20:58:39.600 回答