7

Apache Camel 提供了几种执行数据转换的方法:其转换 EIP 的概念、自定义数据格式,以及允许自定义类型转换器。

我有一种情况,我需要从骆驼路线内部进行非常复杂的转换。我应该实现我自己的类型转换器、我自己的 DataFormat,还是应该实现org.apache.camel.Expression并将所有转换的东西放在那里:

public class MyTransformer implements Expression {
    @Override
    public <T> T evaluate(Exchange arg0, Class<T> arg1) {
        // ...
    }
}

我想我对何时/何时使用您自己的类型转换器、何时使用.transform(myTransformer)处理器或何时使用自定义 DataFormat 感到困惑。提前致谢!

4

2 回答 2

13

差异是微妙的,尽管它们都用于不同的事情。你应该使用:

  • 当您将“业务有效负载”从一种形状转换为另一种形状时的转换器例如,当您将从 DAO 中提取的值对象转换为您将用于调用 Web 服务的 JAXB 注释对象时。
  • 当您想要将高级表示(例如某种类型的对象)编组为较低级别表示时的数据格式- 您可以通过线路发送的东西。数据格式包括序列化、Google 协议缓冲区、JSON、JAXB 等。
  • 当您更改访问消息表示的方式时的类型转换器。例如,一个字符串和一个字节数组或一个 InputStream 仍然读取相同的字符,所以你可以在那里编写(尽管实际上有内置的)转换器,在其中任何两个之间进行转换。
于 2013-01-25T14:41:21.497 回答
4

只是补充一下杰克上面所说的。这一切都取决于。

而且您不需要使用任何 Camel API 来执行此操作。在某些情况下,您可能只需要转换一次或几次消息负载。为此,您可以使用普通 POJO 并从 Camel 路由等调用它

例如 POJO 中将 String 转换为 MyOrder 实例的方法。

public MyOrder doSomething(String data) {
    ...
    return ...
}

然后在路由中的消息转换器中使用方法调用

.transform().method(MyBusinessClass.class, "doSomething")

尽管正如 Jake 所回答的那样,使用任何 Camel 方式进行消息转换,但允许您将其无缝集成到 Camel 中,并将其用作一等公民,因为它是由 Camel 本身提供的开箱即用的。并允许您在其他路线和 Camel 应用程序中重用它。

实现 org.apache.camel.Expression 来转换消息有效负载虽然不常用。正如杰克所说,有更好的方法。或者使用如上所示的 POJO。尽管上面的 POJO 最终被评估为 org.apache.camel.Expression,因此您可以实现一次并自己使用它。

如果你有一本 Camel in Action 这本书,那么第 3 章就是用 Camel 转换数据。

于 2013-01-27T07:04:04.173 回答