Многие из вас давно работают с различными 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 (один из переводов с англ. «направлять»).
Компонент direct обеспечивает прямой вызов между producer и consumer. Он позволяет подключаться исключительно изнутри Camel, поэтому внешние системы не могут отправлять сообщения непосредственно на него. Этот компонент используется в Camel для выполнения таких задач, как объединение маршрутов или тестирование.
Эта конечная точка может использоваться только в одном и том же CamelContext.
Компонент direct позволяет выполнять синхронный вызов маршрута. Для асинхронных вызовов он не подходит.
Минимальные накладные расходы делают 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: доступные параметры компонента вы можете изучить по ссылке.