Многие из вас давно работают с различными Java-фреймворками, их в опенсорсе целое множество, и у каждого есть свои преимущества и недостатки. Сегодня хотим обсудить Apache Camel, а именно, компонент direct. Эта статья от инженера-программиста Nexign Андрея Малыгина будет полезна тем, кто уже работает на этом фреймворке и хочет сделать свою работу чуточку легче.

Для чего нужен компонент direct

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

Компонент direct в Apache Camel позволяет разбить один маршрут на много маленьких. Дробите их настолько, насколько вам этого захочется.

Давайте перейдём к конкретике. Наверное первый вопрос в работе с direct — «Что означает эта запись?». 

Рассмотрим простой транзитивный пример разбиения.

from("theSamePoint1").process(?).to("theSamePoint2");
from("theSamePoint1").to("direct:intermediatePoint");
from("direct:intermediatePoint").process(?).to("theSamePoint2");

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

Разработчики Apache Camel добавили этот компонент в самой первой версии фреймворка, и он стал самым используемым в приложениях.

Итак, углубимся в теорию

Direct (один из переводов с англ. «направлять»).

  1. Компонент direct обеспечивает прямой вызов между producer и consumer. Он позволяет подключаться исключительно изнутри Camel, поэтому внешние системы не могут отправлять сообщения непосредственно на него. Этот компонент используется в Camel для выполнения таких задач, как объединение маршрутов или тестирование.

  2. Эта конечная точка может использоваться только в одном и том же CamelContext.

  3. Компонент direct позволяет выполнять синхронный вызов маршрута. Для асинхронных вызовов он не подходит.

  4. Минимальные накладные расходы делают direct компонент отличным способом запуска маршрутов и синхронного разбиения маршрутов на несколько частей.

Закрепим на примере

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

Например, мы используем этот компонент в качестве промежуточной точки. Тогда direct:"choosePoint" выполняет функцию фильтра, где может описываться логика перехода между точками.

Стоит отметить, что тут direct:"choosePoint" является необязательным промежуточным звеном. Но если бы он отсутствовал, для реализации логики данной программы нам пришлось бы писать очень много «копипастного» кода, что в программировании дурной тон.

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

from(theSame1Point).choice().when(?).to("direct:point1"))
.otherwise().to("direct:point2");

from(theSame2Point).choice().when(?).to("direct:point1"))
.otherwise().to("direct:point2");

from(theSame3Point).choice().when(?).to("direct:point1"))
.otherwise().to("direct:point2");

Итоги, параметры и документация

Итак, повторим основные выводы.

Direct позволит вам легко произвести декомпозицию ваших задач. Сделайте из одного большого маршрута много простых и маленьких. Как результат — вы не допустите ошибок в бесконечном коде.

Надеемся, материал помог понятьчто вам стало понятно, что представляет собой компонент direct. Ну и, конечно, для самых пытливых читателей поделимся официальной документацией Apache Camel: доступные параметры компонента вы можете изучить по ссылке.

Комментарии (1)


  1. Akvel
    20.04.2022 10:03
    +1

    Спасибо за статью, еще хочется добавить, что один из интересных кейсов с direct это использование с продюсером toD()