Статьи

Весенний ботинок и Apache Camel

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

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

Первым шагом является включение верблюжьей зависимости в наш весенний проект.

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
buildscript {
    ext {
        springBootVersion = '1.5.9.BUILD-SNAPSHOT'
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}
 
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
 
group = 'com.gkatzioura'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
 
repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}
 
 
dependencies {
    compile('org.apache.camel:camel-spring-boot-starter:2.20.0')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.apache.camel:camel-test-spring:2.20.0')
}

Чтобы ускорить настройку проекта с нуля, вы всегда можете воспользоваться онлайн-пружинным инициализатором .

Теперь давайте добавим простой маршрут

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
package com.gkatzioura.springcamel.routes;
 
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
 
@Component
public class TimerRoute extends RouteBuilder {
 
    public static final String ROUTE_NAME = "TIMER_ROUTE";
 
    @Override
    public void configure() throws Exception {
        from("timer:initial//start?period=10000")
                .routeId(ROUTE_NAME)
                .to("log:executed");
    }
}

Нам не нужно беспокоиться о конфигурации контекста верблюда, поскольку автоконфигурация Camel создает SpringCamelContext для вас и заботится о правильной инициализации и закрытии этого контекста.

Кроме того, автоконфигурация Camel собирает все экземпляры RouteBuilder из контекста Spring и автоматически внедряет их в предоставленный CamelContext. Таким образом, нам не нужно регистрировать наши маршруты в CamelContext.

Как вы можете видеть, наш маршрут имеет таймер с периодом 10000 миллисекунд, который направляет к конечной точке журнала. Конечная точка журнала будет печатать выполненную строку каждые 10000 миллисекунд.

Имейте в виду, что если не указан параметр routeId, верблюд сам назначит имя, поэтому предоставление имени нашему определению маршрута является хорошей практикой в ​​случае, если мы хотим получить определение корня.

Чтобы верблюд не ложился спать, нам нужно заблокировать основной поток. Таким образом, мы добавляем эту конфигурацию в наш файл application.yml.

1
2
3
camel:
  springboot:
    main-run-controller: true

Вместо этого мы можем включить зависимость spring-boot-starter-web, но наше приложение имеет как можно меньше зависимостей, и мы должны сохранить это так.

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

Например, мы выполним проверку маршрута, указанного ранее.

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
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
public class SpringCamelApplicationTests {
 
    @EndpointInject(uri = MOCK_RESULT)
    private MockEndpoint resultEndpoint;
 
    @Autowired
    private CamelContext camelContext;
 
    @EndpointInject(uri = MOCK_TIMER)
    private ProducerTemplate producer;
 
    private static final String MOCK_RESULT = "mock:result";
    private static final String MOCK_TIMER = "direct:mock-timer";
 
    @Before
    public void setup() throws Exception {
 
        camelContext.getRouteDefinition(TimerRoute.ROUTE_NAME)
                .autoStartup(true)
                .adviceWith(camelContext, new AdviceWithRouteBuilder() {
                    @Override
                    public void configure() throws Exception {
                        replaceFromWith(MOCK_TIMER);
                        interceptSendToEndpoint("log*")
                                .skipSendToOriginalEndpoint()
                                .to(MOCK_RESULT);
                    }
                });
    }
 
    @Test
    public void sendMessage() throws Exception {
 
        resultEndpoint.expectedMessageCount(1);
        producer.sendBody("A message");
        resultEndpoint.assertIsSatisfied();
    }
 
}

Давайте посмотрим на каждую часть теста.

Нашим бегуном JUnit будет CamelSpringBootRunner.class

1
@RunWith(CamelSpringBootRunner.class)

Мы внедряем шаблон производителя . Интерфейс ProducerTemplate позволяет отправлять обмен сообщениями на конечные точки различными способами, чтобы упростить работу с экземплярами Camel Endpoint из кода Java.

Затем мы вводим MockEndpoint. MockEndpoint послужит нам, заменив исходную конечную точку. Затем мы установим ожидаемое количество сообщений, которые будут получены. После завершения обработки мы утверждаем, что количество полученных сообщений удовлетворяется.

В нашем методе настройки мы заменим нашу исходную конечную точку на поддельную конечную точку шаблона производителя. Таким образом, наш маршрут будет получать события, которые мы выдадим из шаблона ProducerTemplate.
Затем мы также перехватим конечную точку журнала и направим сообщение в ранее указанную точку MockEndpoint.

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

Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Spring boot и Apache Camel

Мнения, высказанные участниками Java Code Geeks, являются их собственными.