Перейти к основному содержимому

Использование Apache Camel с Spring

· 5 мин. чтения

1. Обзор

В этой статье показано, как настроить и использовать Apache Camel с Spring.

Apache Camel предоставляет довольно много полезных компонентов, поддерживающих такие библиотеки, как JPA , Hibernate , FTP , Apache-CXF , AWS-S3 и, конечно же, многие другие — все это помогает интегрировать данные между двумя разными системами.

Например, используя компоненты Hibernate и Apache CXF, вы можете извлекать данные из базы данных и отправлять их в другую систему с помощью вызовов REST API.

В этом уроке мы рассмотрим простой пример Camel — чтение файла и преобразование его содержимого в верхний, а затем обратно в нижний регистр. Мы собираемся использовать компонент Camel File и Spring 4.2.

Вот полная информация о примере:

  1. Прочитать файл из исходного каталога
  2. Преобразование содержимого файла в верхний регистр с помощью пользовательского процессора
  3. Записать преобразованный вывод в целевой каталог
  4. Преобразование содержимого файла в нижний регистр с помощью Camel Translator
  5. Записать преобразованный вывод в целевой каталог

2. Добавьте зависимости

Чтобы использовать Apache Camel с Spring, вам понадобятся следующие зависимости в вашем файле POM:

<properties>
<env.camel.version>2.16.1</env.camel.version>
<env.spring.version>4.2.4.RELEASE</env.spring.version>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${env.camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>${env.camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stream</artifactId>
<version>${env.camel.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${env.spring.version}</version>
</dependency>
</dependencies>

Итак, у нас есть:

  • camel-core — основная зависимость для Apache Camel
  • camel-spring — позволяет нам использовать Camel с Spring
  • camel-stream — необязательная зависимость, которую вы можете использовать (например) для отображения некоторых сообщений в консоли во время выполнения маршрутов.
  • spring-context — стандартная зависимость Spring, необходимая в нашем случае, поскольку мы собираемся запускать маршруты Camel в контексте Spring.

3. Контекст весеннего верблюда

Во-первых, мы создадим файл конфигурации Spring, в котором позже мы определим наши маршруты Camel.

Обратите внимание, что файл содержит все необходимые пространства имен Apache Camel и Spring и расположения схемы:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd">

<camelContext xmlns="http://camel.apache.org/schema/spring">
<!-- Add routes here -->
</camelContext>

</beans>

Элемент <camelContext> представляет (что неудивительно) контекст Camel, который можно сравнить с контекстом приложения Spring. Теперь ваш файл контекста готов для определения маршрутов Camel.

3.1. Верблюжий маршрут с пользовательским процессором

Далее мы напишем наш первый маршрут для преобразования содержимого файла в верхний регистр.

Нам нужно определить источник, из которого маршрут будет считывать данные. Это может быть база данных, файл, консоль или любое количество других источников. В нашем случае это будет файл.

Затем нам нужно определить обработчик данных, которые будут считываться из источника. Для этого примера мы собираемся написать собственный класс процессора. Этот класс будет bean-компонентом Spring, который будет реализовывать стандартный интерфейс процессора Camel .

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

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

<route>
<from uri="file://data/input" /> <!-- INPUT -->
<process ref="myFileProcessor" /> <!-- PROCESS -->
<to uri="file://data/outputUpperCase" /> <!-- OUTPUT -->
</route>

Кроме того, мы должны определить bean- компонент myFileProcessor :

<bean id="myFileProcessor" class="org.apache.camel.processor.FileProcessor" />

3.2. Пользовательский процессор верхнего регистра

Теперь нам нужно создать собственный файловый процессор, который мы определили в нашем bean-компоненте. Он должен реализовать интерфейс Camel Processor , определяя единственный метод процесса , который принимает объект Exchange в качестве входных данных. Этот объект предоставляет сведения о данных из источника ввода.

Наш метод должен прочитать сообщение из Exchange , перевести содержимое в верхний регистр, а затем установить это новое содержимое обратно в объект Exchange :

public class FileProcessor implements Processor {

public void process(Exchange exchange) throws Exception {
String originalFileContent = (String) exchange.getIn().getBody(String.class);
String upperCaseFileContent = originalFileContent.toUpperCase();
exchange.getIn().setBody(upperCaseFileContent);
}
}

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

3.3. Процессор нижнего регистра

Теперь мы добавим еще один вывод к нашему маршруту Camel. На этот раз мы преобразуем данные того же входного файла в нижний регистр. Однако на этот раз мы не будем использовать собственный процессор; мы будем использовать функцию переводчика сообщений Apache Camel . Это обновленный маршрут Camel:

<route>
<from uri="file://data/input" />
<process ref="myFileProcessor" />
<to uri="file://data/outputUppperCase" />
<transform>
<simple>${body.toLowerCase()}</simple>
</transform>
<to uri="file://data/outputLowerCase" />
</route>

4. Запуск приложения

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

ClassPathXmlApplicationContext applicationContext = 
new ClassPathXmlApplicationContext("camel-context.xml");

После успешного запуска маршрута будут созданы два файла: один с содержимым в верхнем регистре, а другой с содержимым в нижнем регистре.

5. Вывод

Если вы занимаетесь интеграцией, Apache Camel определенно упростит вам задачу. Библиотека предоставляет компоненты plug-and-play, которые помогут вам сократить шаблонный код и сосредоточиться на основной логике обработки данных.

И если вы хотите подробно изучить концепции Enterprise Integration Patterns , вам следует взглянуть на эту книгу , написанную Грегором Хохпе и Бобби Вульфом, которые очень четко концептуализируют EIP.

Пример, описанный в этой статье, доступен в проекте на GitHub .