CamelContext обеспечивает доступ ко всем другим сервисам в Camel, как показано на следующем рисунке —
Давайте посмотрим на различные услуги. Модуль Реестра по умолчанию является реестром JNDI, который содержит названия различных Javabeans, которые использует ваше приложение. Если вы используете Camel с Spring, это будет Spring ApplicationContext . Если вы используете Camel в контейнере OSGI, это будет реестр OSGI . Преобразователи типов, как следует из названия, содержат различные загруженные преобразователи типов, которые преобразуют ваш ввод из одного формата в другой. Вы можете использовать встроенные преобразователи типов или предоставить свой собственный механизм преобразования. Модуль Компоненты содержит компоненты, используемые вашим приложением. Компоненты загружаются путем автоматического обнаружения в указанном вами пути к классам . В случае контейнера OSGI они загружаются всякий раз, когда активируется новый пакет. Мы уже обсуждали конечные точки и маршруты в предыдущих главах. Модуль « Форматы данных » содержит загруженные форматы данных, и, наконец, модуль « Языки » представляет загруженные языки.
Фрагмент кода здесь даст вам представление о том, как CamelContext создается в приложении Camel —
CamelContext context = new DefaultCamelContext(); try { context.addRoutes(new RouteBuilder() { // Configure filters and routes } } );
Класс DefaultCamelContext обеспечивает конкретную реализацию CamelContext . В методе addRoutes мы создаем анонимный экземпляр RouteBuilder . Вы можете создать несколько экземпляров RouteBuilder, чтобы определить более одной маршрутизации. Каждый маршрут в одном и том же контексте должен иметь уникальный идентификатор. Маршруты могут быть добавлены динамически во время выполнения. Маршрут с идентификатором, идентичным ранее определенному, заменит старый маршрут.
Что происходит внутри экземпляра RouteBuilder, описано далее.
Маршруты
Маршрутизатор определяет правило перемещения сообщения из одного места в другое. Вы используете RouteBuilder для определения маршрута в Java DSL. Вы создаете маршрут, расширяя встроенный класс RouteBuilder . Маршрут начинается с конечной точки и заканчивается в одной или нескольких конечных точках. Между ними вы реализуете логику обработки. Вы можете настроить любое количество маршрутов в одном методе настройки .
Вот типичный пример того, как создается маршрут —
context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:DistributeOrderDSL") .to("stream:out"); } }
Мы переопределяем метод configure класса RouteBuilder и реализуем в нем наш механизм маршрутизации и фильтрации. В текущем случае мы перенаправляем ввод, полученный от Endpoint DistributeOrderDSL, на консоль, которая указана потоком Endpoint : out .
Выбор языка
Вы можете создавать маршруты на разных языках. Вот несколько примеров того, как один и тот же маршрут определяется на трех разных языках:
Java DSL
from ("file:/order").to("jms:orderQueue");
Spring DSL
<route> <from uri = "file:/order"/> <to uri = "jms:orderQueue"/> </route>
Scala DSL
from "file:/order" -> "jms:orderQueue"
фильтры
Вы используете фильтр, чтобы выбрать часть входного контента. Чтобы настроить фильтр, вы используете любую произвольную реализацию Predicate . Затем отфильтрованный входной сигнал отправляется в конечную точку по вашему желанию. В этом примере мы отфильтровываем все заказы на мыло, чтобы их можно было вместе отправить поставщику мыла.
from("direct:DistributeOrderDSL") .split(xpath("//order[@product = 'soaps']/items")) .to("stream:out");
В этом примере мы использовали предикат xpath для фильтрации. Если вы предпочитаете использовать Java-класс для фильтрации, используйте следующий код —
from("direct:DistributeOrderDSL") .filter() .method(new Order(),"filter") .to("stream:out");
Order — это ваш пользовательский класс Java с собственным механизмом фильтрации.
Вы можете объединить несколько предикатов в одну маршрутизацию, как здесь —
from("direct:DistributeOrderDSL") .choice() .when(header("order").isEqualTo("oil")) .to("direct:oil") .when(header("order").isEqualTo("milk")) .to("direct:milk") .otherwise() .to("direct:d");
Таким образом, теперь все «нефтяные» заказы будут отправлены поставщику нефти, а «молочные» заказы — поставщику молока, а остальные — в общий пул.
Пользовательский процессор
Вы также можете использовать пользовательскую обработку. В приведенном ниже примере создается собственный процессор с именем myCustomProcessor и использует его в построителе маршрутов.
Processor myCustomProcessor = new Processor() { public void process(Exchange exchange) { // implement your custom processing } }; RouteBuilder builder = new RouteBuilder() { public void configure() { from("direct:DistributeOrderDSL") .process(myProcessor); } };
Вы можете использовать пользовательские процессоры наряду с выбором и фильтрацией, чтобы лучше контролировать посредничество и маршрутизацию —
from("direct:DistributeOrderDSL") .filter(header("order").isEqualTo("milk")) .process(myProcessor);
Использование XML
Маршруты могут быть определены в более объемном XML, если вы предпочитаете это. В следующем фрагменте XML показано, как создать маршрут вместе с некоторой фильтрацией через Spring XML.
<camelContext xmlns = "http://camel.apache.org/schema/spring"> <route> <from uri = "direct:DistributeOrderXML"/> <log message = "Split by Distribute Order"/> <split> <xpath>//order[@product = 'Oil']/items</xpath> <to uri = "file:src/main/resources/order/"/> <to uri = "stream:out"/> </split> </route> </camelContext>
Посмотрев, как строятся маршруты, теперь мы увидим различные методы создания конечных точек.