【问题标题】:Which Camel construct is suited for transforming?哪种骆驼构造适合转换?
【发布时间】:2013-01-08 04:41:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java apache-camel esb


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      而且您不需要使用任何 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 转换数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-21
        • 2019-02-22
        • 1970-01-01
        • 2013-04-19
        • 2014-04-21
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多