Найти тему

Условная маршрутизация Apache Camel

Оглавление

1. Обзор

Apache Camel — это мощная платформа интеграции с открытым исходным кодом, реализующая несколько известных шаблонов интеграции предприятия.

Обычно при работе с маршрутизацией сообщений с помощью Camel нам нужен способ обработки сообщений по-разному в зависимости от их содержимого. Для этого Camel предоставляет мощную функцию под названием Маршрутизатор на основе содержимого из набора шаблонов EIP.

В этом руководстве мы рассмотрим несколько способов маршрутизации сообщений на основе некоторых условий.

2. Зависимости

Все, что нам нужно для начала, — это Camel-Spring-Boot-Starter, добавленный в наш pom.xml:

-2

Затем нам нужно добавить зависимость camel-test-spring-junit5 в наш pom.xml:

-3

Как следует из названия, эта зависимость предназначена специально для наших модульных тестов.

3. Определение простого приложения Camel Spring Boot

На протяжении всего этого руководства в центре внимания наших примеров будет простое приложение Apache Camel Spring Boot.

Итак, давайте начнем с определения точки входа нашего приложения:

-4

Как мы видим, это стандартное приложение Spring Boot.

4. Условная маршрутизация

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

Например, маршрут обычно получает сообщение, используя потребителя, возможно, из файла на диске или из очереди сообщений. Затем Camel выполняет остальные шаги маршрута, которые либо каким-то образом обрабатывают сообщение, либо отправляют его другим конечным точкам.

Без сомнения,
нам понадобится способ условной маршрутизации сообщения на основе некоторого факта. Для этого Camel предоставляет выбор и когда конструирует. Мы можем думать об этом как об эквиваленте оператора if-else в Java.

Имея это в виду, давайте продолжим и создадим наш первый маршрут с некоторой условной логикой.

5. Создание маршрута

В этом примере мы определим элементарный маршрут с некоторой условной логикой на основе содержимого полученного тела сообщения:

-5

Как мы видим в нашем тривиальном примере, мы настраиваем наш маршрут для получения сообщений из прямой конечной точки, называемой start-conditional.

Теперь давайте пройдемся по ключевым частям нашего маршрута:

  • Во-первых, мы начинаем маршрут, используя метод selection() — это сообщает Camel, что следующие строки будут содержать некоторые условия для оценки.
  • Затем метод when() указывает новое условие для оценки — в этом примере мы просто проверяем, содержит ли тело сообщения строку Baeldung. Мы можем добавить столько условий, сколько нам нужно
  • Чтобы завершить наш маршрут, мы используем метод else(), чтобы определить, что делать, когда ни одно из предыдущих условий не выполняется.
  • Наконец, маршрут завершается с помощью метода end(), закрывающего блок выбора.

Подводя итог, когда мы запускаем наш маршрут, если наше тело сообщения содержит строку Baeldung, мы установим тело сообщения на Goodbye, Baeldung! и отправьте результат в фиктивную конечную точку с именем result-body.

В качестве альтернативы мы просто направим исходное сообщение на нашу фиктивную конечную точку.

6. Тестирование маршрута

Имея в виду последний раздел, давайте продолжим и напишем модульный тест, чтобы изучить, как ведет себя наш маршрут:

-6

Как видим, наш тест состоит из трех простых шагов:

  • Во-первых, давайте установим ожидание, что наша фиктивная конечная точка получит данное тело сообщения.
  • Затем мы отправим сообщение в нашу конечную точку direct:start-conditional, используя наш шаблон. Обратите внимание, мы обеспечим, чтобы наше тело сообщения содержало строку Baeldung
  • Чтобы завершить наш тест, мы используем метод assertIsSatisfied для проверки того, что наше первоначальное ожидание от нашей фиктивной конечной точки было удовлетворено.

Этот тест подтверждает, что наша условная маршрутизация работает правильно. Потрясающий!

Обязательно ознакомьтесь с нашим предыдущим руководством, чтобы узнать больше о том, как писать надежные автономные модульные тесты для наших маршрутов Camel.

7. Построение других условных предикатов

До сих пор мы исследовали один вариант построения нашего предиката when — проверку тела сообщения нашего обмена. Тем не менее, у нас есть несколько других вариантов.

Например, мы также можем контролировать наши условия, проверяя значение заданного заголовка сообщения:

-7

На этот раз мы изменили метод when, чтобы он смотрел на значение заголовка с именем fruit. Также вполне возможно использовать простой язык Camel в наших условиях.

8. Работа с Java-бинами

Кроме того, мы также можем использовать язык Camel Bean, когда хотим использовать результат вызова метода Java в наших предикатах.

Во-первых, нам нужно создать Java-бин, содержащий метод, возвращающий логическое значение:

-8

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

Затем мы можем продолжить и использовать наш FruitBean из нашего блока when:

-9

9. Вывод

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

Затем мы узнали о нескольких других методах построения предикатов в наших маршрутах с использованием заголовков сообщений и Java-бинов.

Оригинал статьи: https://www.baeldung.com/spring-apache-camel-conditional-routing