1. Обзор
В этой статье показано, как настроить и использовать Apache Camel с Spring.
Apache Camel предоставляет довольно много полезных компонентов, поддерживающих такие библиотеки, как JPA , Hibernate , FTP , Apache-CXF , AWS-S3 и, конечно же, многие другие — все это помогает интегрировать данные между двумя разными системами.
Например, используя компоненты Hibernate и Apache CXF, вы можете извлекать данные из базы данных и отправлять их в другую систему с помощью вызовов REST API.
В этом уроке мы рассмотрим простой пример Camel — чтение файла и преобразование его содержимого в верхний, а затем обратно в нижний регистр. Мы собираемся использовать компонент Camel File и Spring 4.2.
Вот полная информация о примере:
- Прочитать файл из исходного каталога
- Преобразование содержимого файла в верхний регистр с помощью пользовательского процессора
- Записать преобразованный вывод в целевой каталог
- Преобразование содержимого файла в нижний регистр с помощью Camel Translator
- Записать преобразованный вывод в целевой каталог
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 Camelcamel-spring
— позволяет нам использовать Camel с Springcamel-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 .