Возможно, вы слышали, что порой Apache Camel используется для создания продуктов класса ESB. У него огромные возможности. Можно интегрировать что угодно с чем угодно. Файлы, ftp, почта, брокеры, да все, что угодно. Выбирайте компоненты на любой вкус. Apache Camel позволяет написать маршрут не только при помощи java dsl, но и xml dsl, и yaml dsl. Да, java знать не обязательно!
Вот пример маршрута, который запускается по таймеру (раз в пять секунд), устанавливает в качестве тела "Hello, world!" и выводит тело сообщения в лог:
<route>
<from uri="timer://my-timer?period=5000" />
<setBody>
<constant>Hello, world!</constant>
</setBody>
<to uri="log:com.example" />
</route>
Согласитесь, это красиво. Ничего лишнего. Начинаться маршрут может не только с таймера (это лишь пример), а, например, с получения сообщения из брокера сообщений. И заканчиваться, соответственно, он тоже может чем угодно (записью файла, отправкой сообщения в брокер сообщений и т.д.). Также внутри маршрута могут быть всякого рода преобразования, условия и многое другое.
Но как же запустить этот маршрут? Вариантов тут несколько. Можно создать maven-проект и скомпилировать его. Можно где-то запустить Apache Karaf с Camel на борту и скормить ему маршрут. Но все это звучит как-то сложновато. Да и не хочется ставить дополнительный софт себе на машину. Хочется ведь скорее попробовать свой первый маршрут, а не разбираться во всех этих сложностях, правда?
И такой вариант есть. Можно запустить свой первый маршрут в докере. Ну да, допускаю, что тут тоже кто-то может отвалиться). Ну вот такое допущение, что вы знакомы с докером.
Для тех, кто остался. Есть официальный образ camel-jbang. Правда, там есть проблемы с запуском. Не буду тут вдаваться в подробности, это можно обсудить в комментариях. Я попробовал немного подкорректировать докер-файл из репозитория Apache Camel так, чтобы запустить наш первый маршрут было максимально просто.
Итак, инструкция по запуску нашего первого маршрута для Apache Camel.
- Склонируте репозиторий https://github.com/pila86/apache-camel-simple-examples. Ну или просто скачайте архив и распакуйте его
git clone https://github.com/pila86/apache-camel-simple-examples
- Перейдите в каталог
cd ./apache-camel-simple-examples
- Поправьте при необходимости маршрут, который находится в "./examples/hello-world.camel.xml". Можно пропустить этот шаг.
- Запустите маршрут при помощи docker compose:
docker compose up
Вот, собственно, и все. Наблюдаем в консоли результат работы нашего маршрута:
camel-jbang-1 | 2024-11-06 17:40:24.693 INFO 7 --- [ main] org.apache.camel.main.MainSupport : Apache Camel (JBang) 4.8.1 is starting
camel-jbang-1 | 2024-11-06 17:40:24.806 INFO 7 --- [ main] org.apache.camel.main.MainSupport : Using Java 21.0.5 with PID 7. Started by root in /
camel-jbang-1 | 2024-11-06 17:40:24.886 INFO 7 --- [ main] org.apache.camel.main.ProfileConfigurer : The application is starting with profile: dev
camel-jbang-1 | 2024-11-06 17:40:25.272 INFO 7 --- [ main] he.camel.cli.connector.LocalCliConnector : Camel JBang CLI enabled
camel-jbang-1 | 2024-11-06 17:40:25.310 INFO 7 --- [ main] e.camel.impl.engine.AbstractCamelContext : Apache Camel 4.8.1 (hello-world) is starting
camel-jbang-1 | 2024-11-06 17:40:25.429 INFO 7 --- [ main] e.camel.impl.engine.AbstractCamelContext : Routes startup (total:1)
camel-jbang-1 | 2024-11-06 17:40:25.429 INFO 7 --- [ main] e.camel.impl.engine.AbstractCamelContext : Started route1 (timer://my-timer)
camel-jbang-1 | 2024-11-06 17:40:25.429 INFO 7 --- [ main] e.camel.impl.engine.AbstractCamelContext : Apache Camel 4.8.1 (hello-world) started in 118ms (build:0ms init:0ms start:118ms)
camel-jbang-1 | 2024-11-06 17:40:26.377 INFO 7 --- [imer://my-timer] com.example : Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello, world!]
camel-jbang-1 | 2024-11-06 17:40:31.370 INFO 7 --- [imer://my-timer] com.example : Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello, world!]
camel-jbang-1 | 2024-11-06 17:40:36.371 INFO 7 --- [imer://my-timer] com.example : Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello, world!]
camel-jbang-1 | 2024-11-06 17:40:41.370 INFO 7 --- [imer://my-timer] com.example : Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello, world!]
Надеюсь, у вас получилось. Если возникли сложности - пишите в комментариях. Пишите, интересны ли другие примеры, или стоит написать, как можно запустить и отладить маршрут в vs code? А еще можно использовать Karavan, чтобы собрать маршрут из "кубиков". Также есть некоторые мысли по примеру маршрута, который подключится сразу к нескольким базам 1С через odata (причем параллельно) и соберет определенные данные в одно сообщение.