【问题标题】:Camel Message Forwarding, Which method to call?骆驼消息转发,调用哪个方法?
【发布时间】:2014-04-21 12:31:34
【问题描述】:

我是 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());
    }
}

这很好用,我得到了包含包含文件的“In message”的 Exchange。 exchange.getIn().toString() 给了我文件名。

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

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

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

如果我然后重写 MyBean 并实现它:

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

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

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

非常感谢。

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

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

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

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

    查看此链接https://camel.apache.org/content-based-router.html

    希望对你有帮助

    【讨论】:

    • 感谢您的回答。我的问题是,如果我将包含文件的 Exchange 传递给具有接受字符串的方法的 bean,我怎么知道字符串是文件的内容,而不是文件名?这是否记录在某处?
    【解决方案2】:

    简短的回答是:

    1. file 组件将文件内容作为文件放在正文中。
    2. 如果你让你的bean实现Processor,那么你可以通过exchange.getIn().getHeader("CamelFilePath")获得process(exchange)中正在处理的文件的完整路径名。
    3. 您的第二个实验成功了,因为 camel 猜测调用了您的 bean myMethod1 将 File 转换为 String 的唯一方法。 如果您只是路由到您的 bean,则只有身体会被骆驼自动转换。因此,您可以确保在方法参数中获取文件内容。查看file组件的描述,看看设置了哪些header。
    4. 您的下一次尝试失败了,因为骆驼无法猜出您要如何将 File 转换为 Integer。

    要更深入地了解您所做的事情,请阅读 about Type Converter 并查看开箱即用的骆驼可用转换器列表。 要进一步了解骆驼如何猜测交换体内容与您的 bean 方法的匹配,请阅读about Bean Binding。它还允许将标头绑定到带有 DSL 中的表达式或代码注释的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-24
      • 2019-07-07
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 2014-06-21
      相关资源
      最近更新 更多