Camel Message Forwarding,请问哪种方法?

时间:2014-03-16 09:22:55

标签: java apache-camel

我是Apache Camel的新手。我有一个问题,关于如何将方法传递给路由中定义的bean。

我有以下路线定义:

<bean id="myBean" class="camel.MyBean"/>

<camelContext id="testContext" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="file:data/inbox?noop=true"/>
        <to uri="myBean"/>
        <to uri="file:data/outbox"/>
    </route>
</camelContext>

MyBean类定义如下:

public class MyBean {
    public void myMethod(Exchange exchange) {
        System.out.println("MyBean myMethod " + exchange.getIn().toString());
    }
}

这很好用,我得到的Exchange包含一个&#34; In message&#34;其中包含该文件。 exchange.getIn().toString()为我提供了文件名。

如果我重写MyBean并使其成为:

public class MyBean {
    public void myMethod1(String string) {
        System.out.println("MyBean myMethod1 " + string);
    }
}

它也有效。传入的消息以某种方式转换为包含传入文本文件内容的String。

如果我然后重写MyBean并成功:

public class MyBean {
    public void myMethod2(Integer integer) {
        System.out.println("MyBean myMethod2 " + integer);
    }
}

然后它停止了工作。我想这可能是因为Camel无法将文件转换为整数。

然后我有一个问题:尽管Camel在封面下为我们进行了所有类型转换,但我们仍然需要知道它携带的数据类型,以便我们在路由上设计节点。似乎没有规则可循。 Camel的一般规则是什么规定了这种类型转换是如何进行的?

非常感谢。

2 个答案:

答案 0 :(得分:0)

首先,系统将被设计为在特定格式下理解输入数据,这意味着将为其他系统(想要通信的人)定义合同。

要回答您的问题,让我们假设您开发的应用程序只能处理XML输入,并且您可能有'N'个用户可能需要使用您的应用程序来处理将以CSV,管道分隔等方式发送数据的人员, 在这种情况下,您必须接收所有这些消息,并根据您必须解析的内容类型并转换为将由您的核心处理器处理的xml消息。在这种情况下,核心处理器实际上进行实际处理。

Camel为此提供了基于Conten的路由器。

点击此链接https://camel.apache.org/content-based-router.html

希望这有帮助

答案 1 :(得分:0)

简短的答案是:

  1. 文件组件将文件内容作为文件放在正文中。
  2. 如果您创建了bean实现Processor,那么您可以使用process(exchange)获取exchange.getIn().getHeader("CamelFilePath")中正在执行的文件的完整路径名。
  3. 你的第二个实验成功了,因为camel猜测调用你的bean的唯一方法myMethod1将File转换为String。 如果你只是路由到你的bean,只有身体被骆驼自动转换。因此,您可以确保在method参数中获取文件内容。请参阅file组件的说明,了解设置的标头。
  4. 你的下一次尝试失败了,因为camel无法告诉你如何将File转换为Integer。
  5. 为了更深入地了解您所做的事情,请阅读about Type Converter并查看开箱即用的转换器列表。 为了进一步理解camel如何猜测交换体内容与bean方法的匹配,请阅读about Bean Binding。它还允许将标头绑定到带有DSL表达式的参数或带有代码注释的参数。