Введение в Apache Camel

Введение в Apache Camel

1. обзор

В этой статье мы будемintroduce Camel and explore one of its core concepts – message routing.

Мы начнем с рассмотрения этих основополагающих концепций и терминологии, а затем представим два основных варианта определения маршрутов - Java DSL и Spring DSL.

Мы также продемонстрируем это на примере - определив маршрут, по которому файлы из одной папки перемещаются в другую, аprepending- это временная метка для каждого имени файла.

2. О Apache Camel

Apache Camel - это платформа интеграции с открытым исходным кодом, призванная упростить и упростить интеграцию систем.

Это позволяет конечным пользователям интегрировать различные системы, используя один и тот же API, обеспечивая поддержку нескольких протоколов и типов данных, в то же время расширяясь и позволяя вводить пользовательские протоколы.

3. Maven Зависимости

Чтобы использовать Camel, нам нужно сначала добавить зависимость Maven:


    org.apache.camel
    camel-core
    2.18.0

Последнюю версию артефакта Camel можно найтиhere.

3. Доменный язык

Маршруты и маршрутизация двигателя являются центральной частью Camel. Маршруты содержат поток и логику интеграции между различными системами.

Чтобы определить маршруты более простыми и понятными, Camel предлагает несколько различных предметно-ориентированных языков (DSL) для языков программирования, таких как Java или Groovy. С другой стороны, он также обеспечивает определение маршрутов в XML с помощью Spring DSL.

Использование Java DSL или Spring DSL в основном является предпочтением пользователя, так как большинство функций доступны в обоих.

Java DSL предлагает немного больше функций, которые не поддерживаются в Spring DSL. Однако Spring DSL иногда более выгоден, так как XML может быть изменен без необходимости перекомпиляции кода.

4. Терминология и архитектура

Давайте теперь обсудим основную терминологию и архитектуру Camel.

Сначала мы рассмотрим основные концепции Camel здесь:

  • Message содержит данные, которые передаются по маршруту. Каждое сообщение имеет уникальный идентификатор и состоит из тела, заголовков и вложений.

  • Exchange - это контейнер сообщения, который создается, когда сообщение получено потребителем в процессе маршрутизации. Exchange допускает различные типы взаимодействия между системами - он может определять одностороннее сообщение или сообщение запрос-ответ

  • Endpoint - это канал, через который система может получать или отправлять сообщения. Он может ссылаться на URI веб-службы, URI очереди, файл, адрес электронной почты и т. Д.

  • Component действует как фабрика конечных точек. Проще говоря, компоненты предлагают интерфейс к различным технологиям, используя тот же подход и синтаксис. Camel уже поддерживаетa lot of components в своих DSL почти для всех возможных технологий, но также дает возможность писать собственные компоненты.

  • Processor - это простой интерфейс Java, который используется для добавления пользовательской логики интеграции к маршруту. Он содержит единственный методprocess, используемый для предварительной настройки пользовательской бизнес-логики в сообщении, полученном потребителем.

На высоком уровне архитектура Camel проста. CamelContext представляет систему времени выполнения Camel и связывает различные концепции, такие как маршруты, компоненты или конечные точки.

Кроме того, процессоры обрабатывают маршрутизацию и преобразования между конечными точками, а конечные точки объединяют разные системы.

5. Определение маршрута

Маршруты могут быть определены с помощью Java DSL или Spring DSL.

Мы проиллюстрируем оба стиля, определив маршрут, который использует файлы из одной папки и перемещает их в другую папку, аprepending- это временная метка для каждого имени файла.

5.1. Маршрутизация с Java DSL

Чтобы определить маршрут с помощью Java DSL, нам сначала нужно создать экземплярDefaultCamelContext. После этого нам нужно расширить классRouteBuilder и реализовать методconfigure, который будет содержать поток маршрута:

private static final long DURATION_MILIS = 10000;
private static final String SOURCE_FOLDER = "src/test/source-folder";
private static final String DESTINATION_FOLDER
  = "src/test/destination-folder";

@Test
public void moveFolderContentJavaDSLTest() throws Exception {
    CamelContext camelContext = new DefaultCamelContext();
    camelContext.addRoutes(new RouteBuilder() {
      @Override
      public void configure() throws Exception {
        from("file://" + SOURCE_FOLDER + "?delete=true").process(
          new FileProcessor()).to("file://" + DESTINATION_FOLDER);
      }
    });
    camelContext.start();
    Thread.sleep(DURATION_MILIS);
    camelContext.stop();
}

Методconfigure можно читать так: читать файлы из исходной папки, обрабатывать их с помощьюFileProcessor и отправлять результат в папку назначения. Установкаdelete=true означает, что файл будет удален из исходной папки после успешной обработки.

Чтобы запустить Camel, нам нужно вызвать методstart наCamelContext. Thread.sleep вызывается, чтобы дать Camel время, необходимое для перемещения файлов из одной папки в другую.

FileProcessor реализует интерфейсProcessor и содержит единственный методprocess, который содержит логику для изменения имен файлов:

public class FileProcessor implements Processor {
    public void process(Exchange exchange) throws Exception {
        String originalFileName = (String) exchange.getIn().getHeader(
          Exchange.FILE_NAME, String.class);

        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat(
          "yyyy-MM-dd HH-mm-ss");
        String changedFileName = dateFormat.format(date) + originalFileName;
        exchange.getIn().setHeader(Exchange.FILE_NAME, changedFileName);
    }
}

Чтобы получить имя файла, мы должны извлечь входящее сообщение из биржи и получить доступ к его заголовку. Аналогично этому, чтобы изменить имя файла, мы должны обновить заголовок сообщения.

5.2. Маршрутизация с помощью Spring DSL

При определении маршрута с помощью Spring DSL мы используем файл XML для настройки наших маршрутов и процессоров. Это позволяет нам настраивать маршруты без использования кода с помощью Spring и, в конечном итоге, дает нам преимущество полной инверсии управления.

Это уже было рассмотрено вexisting article, поэтому мы сосредоточимся на использовании как Spring DSL, так и Java DSL, который обычно является предпочтительным способом определения маршрутов.

При таком расположении CamelContext определяется в Spring XML-файле с использованием настраиваемого синтаксиса XML для Camel, но без определения маршрута, как в случае «чистого» Spring DSL с использованием XML:





    

Таким образом, мы говорим Camel использовать классFileRouter, который содержит определение нашего маршрута в Java DSL:

public class FileRouter extends RouteBuilder {

    private static final String SOURCE_FOLDER =
      "src/test/source-folder";
    private static final String DESTINATION_FOLDER =
      "src/test/destination-folder";

    @Override
    public void configure() throws Exception {
        from("file://" + SOURCE_FOLDER + "?delete=true").process(
          new FileProcessor()).to("file://" + DESTINATION_FOLDER);
    }
}

Чтобы проверить это, мы должны создать экземплярClassPathXmlApplicationContext, который загрузит нашCamelContext в Spring:

@Test
public void moveFolderContentSpringDSLTest() throws InterruptedException {
    ClassPathXmlApplicationContext applicationContext =
      new ClassPathXmlApplicationContext("camel-context.xml");
    Thread.sleep(DURATION_MILIS);
    applicationContext.close();
}

Используя этот подход, мы получаем дополнительную гибкость и преимущества, предоставляемые Spring, а также все возможности языка Java с помощью Java DSL.

6. Заключение

В этой быстрой статье мы представили введение в Apache Camel и продемонстрировали преимущества использования Camel для задач интеграции, таких как маршрутизация файлов из одной папки в другую.

В нашем примере мы увидели, что Camel позволяет вам сосредоточиться на бизнес-логике и уменьшает объем стандартного кода.

Код из этой статьи можно найтиover on GitHub.