Какая конструкция Camel подходит для трансформации?

Apache Camel предлагает несколько способов выполнения преобразований данных: концепция Transform EIP, настраиваемые форматы данных, а также возможность использования настраиваемых преобразователей типов.

У меня есть ситуация, когда мне нужно сделать очень сложное преобразование внутри маршрута Camel. Должен ли я реализовывать свой собственный преобразователь типов, свой собственный формат данных или мне следует реализовать org.apache.camel.Expression и поместить туда все материалы для преобразования:

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

Думаю, я не понимаю, где и когда уместно использовать собственный преобразователь типов, когда использовать процессор .transform(myTransformer) или когда использовать пользовательский формат данных. Заранее спасибо!


person Community    schedule 24.01.2013    source источник


Ответы (2)


Различия незначительны, хотя все они используются для разных целей. Вы должны использовать:

  • трансформатор при преобразовании "бизнес-полезной нагрузки" из одной формы в другую. Например, при преобразовании объектов-значений, извлеченных из DAO, в аннотированные объекты JAXB, которые вы собираетесь использовать для вызова веб-службы.
  • формат данных, когда вы хотите упорядочить представление высокого уровня, например какой-либо тип объекта, в представление более низкого уровня. представление уровня - то, что вы бы отправили по проводам. Форматы данных включают сериализацию, буферы протокола Google, JSON, JAXB и т. д.
  • преобразователь типов при изменении способа доступа к представлению сообщения. Например. String и массив байтов или InputStream по-прежнему считывают одни и те же символы, поэтому вы можете написать (хотя на самом деле есть встроенные) преобразователи, которые преобразуют любые два из них.
person Jakub Korab    schedule 25.01.2013

Просто чтобы добавить то, что Джейк сказал выше. Все это зависит.

И вам не нужно использовать для этого какие-либо API Camel. Могут быть ситуации, когда вам нужно преобразовать полезную нагрузку сообщения только один или несколько раз. И для этого вы можете использовать простой POJO и вызывать его с маршрута Camel и т. д.

Например, метод в POJO, который преобразует String в экземпляр MyOrder.

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

А затем используйте вызов метода в преобразователе сообщений на маршруте

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

Хотя использование любого из способов Camel для преобразования сообщений, как ответил Джейк, позволяет вам интегрировать это в Camel и использовать его в качестве первоклассного гражданина, поскольку он был предоставлен из коробки самим Camel. И позволяет повторно использовать это в других маршрутах и ​​приложениях Camel.

Хотя реализация org.apache.camel.Expression для преобразования полезной нагрузки сообщения используется не так часто. Как говорит Джейк, есть лучшие способы. Или используйте POJO, как показано выше. Хотя приведенный выше POJO в конечном итоге оценивается как org.apache.camel.Expression, и, следовательно, вы можете реализовать его один раз и использовать его самостоятельно.

Если у вас есть книга Camel in Action, то глава 3 посвящена преобразованию данных с помощью Camel.

person Claus Ibsen    schedule 27.01.2013