Apache Camel — очень полезная библиотека, которая помогает вам обрабатывать события или сообщения из разных источников. Вы можете перемещать эти сообщения по многим различным протоколам, таким как между ВМ, HTTP, FTP, JMS или даже DIRECTORY / FILE, и при этом сохранять код обработки свободным от транспортной логики. Это позволяет вам сконцентрироваться на переваривании содержимого сообщений.
Здесь я приведу учебное пособие о том, как начать работу с Apache Camel, используя Java вместо Groovy .
Начнем с создания файла pom.xml
проекта Maven.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation=" < modelVersion >4.0.0</ modelVersion > < groupId >camel-spring-demo</ groupId > < artifactId >camel-spring-demo</ artifactId > < version >1.0-SNAPSHOT</ version > < packaging >jar</ packaging > < properties > < project.build.sourceEncoding >UTF-8</ project.build.sourceEncoding > < camel.version >2.11.1</ camel.version > </ properties > < dependencies > < dependency > < groupId >org.apache.camel</ groupId > < artifactId >camel-core</ artifactId > < version >${camel.version}</ version > </ dependency > < dependency > < groupId >org.slf4j</ groupId > < artifactId >slf4j-simple</ artifactId > < version >1.7.5</ version > </ dependency > </ dependencies > </ project > |
Мы только собираемся изучить camel-core
, которое на самом деле содержит довольно мало полезных компонентов, которые вы можете использовать. Также для целей ведения журнала я добавил slf4j-simple
как реализацию средства slf4j-simple
журнала, чтобы мы могли видеть вывод на консоли.
Далее вам просто нужен класс для построения Route
. Route
подобен определению инструкции для Camel о том, как перемещать ваши сообщения из одной точки в другую. Мы собираемся создать файл src/main/java/camelcoredemo/TimerRouteBuilder.java
который будет генерировать сообщение таймера каждую секунду, а затем передавать процессору, который просто регистрирует его.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
package camelcoredemo; import org.slf4j.*; import org.apache.camel.*; import org.apache.camel.builder.*; public class TimerRouteBuilder extends RouteBuilder { static Logger LOG = LoggerFactory.getLogger(TimerRouteBuilder. class ); public void configure() { from( "timer://timer1?period=1000" ) .process( new Processor() { public void process(Exchange msg) { LOG.info( "Processing {}" , msg); } }); } } |
Это все, что вам нужно для начала. Теперь вы можете создать и запустить эту простую демонстрацию.
1
2
|
bash > mvn compile bash > mvn exec :java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args= '-r camelcoredemo.TimerRouteBuilder' |
Обратите внимание, что мы даже не написали основной класс Java, а просто использовали параметр org.apache.camel.main.Main
чтобы принять RouteBuilder
класса RouteBuilder
качестве параметра. Затем он загрузит и создаст маршрут автоматически.
Управление CamelContext
Когда вы запускаете Camel, он создает объект CamelContext
который содержит много информации о том, как его запустить, включая определение созданного нами Route
. Теперь, если вы хотите иметь больший контроль над этим CamelContext
, вам нужно написать свой собственный класс Main
. Я покажу вам простой здесь.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package camelcoredemo; import org.slf4j.*; import org.apache.camel.*; import org.apache.camel.impl.*; import org.apache.camel.builder.*; public class TimerMain { static Logger LOG = LoggerFactory.getLogger(TimerMain. class ); public static void main(String[] args) throws Exception { new TimerMain().run(); } void run() throws Exception { final CamelContext camelContext = new DefaultCamelContext(); camelContext.addRoutes(createRouteBuilder()); camelContext.setTracing( true ); camelContext.start(); Runtime.getRuntime().addShutdownHook( new Thread() { public void run() { try { camelContext.stop(); } catch (Exception e) { throw new RuntimeException(e); } } }); waitForStop(); } RouteBuilder createRouteBuilder() { return new TimerRouteBuilder(); } void waitForStop() { while ( true ) { try { Thread.sleep(Long.MAX_VALUE); } catch (InterruptedException e) { break ; } } } } |
Как видите, мы повторно использовали существующий класс createRouteBuilder()
внутри createRouteBuilder()
. Наш Main
класс теперь имеет полный контроль над тем, когда создавать, запускать и останавливать CamelContext
. Этот контекст позволяет вам контролировать настройку Camel глобально, а не на уровне Route
. Ссылка javadoc предоставляет все методы установки, которые вы можете изучить, что он может делать.
Заметил, что нам также нужно предоставить несколько кодов настройки в нашем Main
классе. Сначала нам нужно обработать корректное завершение работы, поэтому мы добавили ловушку Java shutdown для вызова контекста stop()
. Во-вторых, нам нужно добавить блок потока после запуска контекста. Причина этого в том, что метод CamelContext#start()
неблокируемый! Если вы не заблокируете Main
поток после запуска, то он просто выйдет сразу после него, что будет бесполезно. Вы хотите запускать Camel как службу (например, сервер) до тех пор, пока вы явно не нажмете CTRL+C
чтобы завершить процесс.
Улучшение Main
класса для запуска CamelContext
Если вы не хотите иметь дело с большей частью кода установки класса Main
такого как приведенный выше, вы можете просто org.apache.camel.main.Main
класс org.apache.camel.main.Main
предоставляемый целочисленным camel-core
верблюда. Если вы вернетесь к этому классу, у вас не будет автоматической настройки контекста, но вы получите все дополнительные функции командной строки, такие как управление продолжительностью процесса, включение трассировки, загрузка пользовательского класса маршрута и т. Д.
Рефакторинг предыдущего примера, вот как это выглядит.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package camelcoredemo; import org.slf4j.*; import org.apache.camel.builder.*; import org.apache.camel.main.Main; public class TimerMain2 extends Main { static Logger LOG = LoggerFactory.getLogger(TimerMain2. class ); public static void main(String[] args) throws Exception { TimerMain2 main = new TimerMain2(); main.enableHangupSupport(); main.addRouteBuilder(createRouteBuilder()); main.run(args); } static RouteBuilder createRouteBuilder() { return new TimerRouteBuilder(); } } |
Теперь наш TimerMain2
намного короче, и вы можете попробовать его, и он должен функционировать так же, как и раньше.
1
2
|
bash > mvn compile bash > mvn exec :java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args= '-t' |
Обратите внимание, что мы -t
опцию -t
и она выведет трассировку Route
. Используйте -h
и вы увидите все доступные опции.
Добавление боба в Registry
верблюдов
В TimerRouteBuilder
выше примере TimerRouteBuilder
мы создали Processor
на лету. Теперь, если вам нужно объединить несколько разных Processor
, было бы лучше минимизировать шум. Camel позволяет вам делать это, регистрируя компоненты обработки в их пространстве реестра, а затем вы просто указываете их в своем маршруте как bean
компонента. Вот как я могу преобразовать приведенный выше пример в обработку bean-компонентов.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package camelcoredemo; import org.slf4j.*; import org.apache.camel.*; import org.apache.camel.builder.*; import org.apache.camel.main.Main; public class TimerBeansMain extends Main { static Logger LOG = LoggerFactory.getLogger(TimerBeansMain. class ); public static void main(String[] args) throws Exception { TimerBeansMain main = new TimerBeansMain(); main.enableHangupSupport(); main.bind( "processByBean1" , new Bean1()); main.bind( "processAgainByBean2" , new Bean2()); main.addRouteBuilder(createRouteBuilder()); main.run(args); } static RouteBuilder createRouteBuilder() { return new RouteBuilder() { public void configure() { from( "timer://timer1?period=1000" ) .to( "bean:processByBean1" ) .to( "bean:processAgainByBean2" ); } }; } // Processor beans static class Bean1 implements Processor { public void process(Exchange msg) { LOG.info( "First process {}" , msg); } } static class Bean2 implements Processor { public void process(Exchange msg) { LOG.info( "Second process {}" , msg); } } } |
Теперь вы видите, что мой Route
очень тонкий и без шумовых помех; и я реорганизовал мой код обработки в отдельные классы. Это способствует лучшему управлению кодом и тестированию, поскольку вы пишете более сложный Route
для решения бизнес-логики. Это позволило вам создать LEGO-подобный блок повторно используемых бобов POJO. Помимо обработки бобов, Camel использует это пространство реестра и для многих других сервисов. Например, вы можете настроить многие другие конечные точки компонентов с помощью дополнительных функций и / или конфигураций. Или, например, замена реализации стратегии пула потоков и т. Д.
Route
в приведенном выше примере построен с использованием того, что называется Java DSL. Маршрут очень удобочитаемый, но вы получите полную поддержку IDE для просмотра всех методов, доступных для вашего маршрута.
Я надеюсь, что эта статья помогла вам начать езду на верблюде. Помимо упомянутого компонента timer
, camel-core
также поставляется со следующими компонентами из своей основной банки.
- компонент бобов
- просмотреть компонент
- компонент набора данных
- прямой компонент
- файловый компонент
- компонент журнала
- фиктивный компонент
- компонент свойств
- седа компонент
- тестовый компонент
- компонент таймера
- заглушка
- компонент проверки
- компонент vm
- компонент xslt
Повеселись!