Учебники

Apache Camel — CamelContext

CamelContext обеспечивает доступ ко всем другим сервисам в Camel, как показано на следующем рисунке —

CamelContext

Давайте посмотрим на различные услуги. Модуль Реестра по умолчанию является реестром 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>

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