Статьи

Использование верблюжьих маршрутов в компонентах Java EE

Я уже давно работаю с Camel, и мне очень нравится, что это просто. Использование его поверх Java EE всегда было небольшой проблемой, и в одном из недавних выступлений, которые я дал, о том, как это сделать, и о различных методах начальной загрузки Camel в Java EE фактически предлагается использовать  подсистему WildFly-Camel . В продолжающейся серии статей я собираюсь исследовать различные способы сделать это и привести несколько примеров, которые до сих пор отсутствуют в докладе. Я рад получить ваши отзывы и пожелания в комментариях или через  @myfear  в твиттере.

Начало работы с Camel On WildFly 8.2 

Подсистема Wildfly-Camel обеспечивает интеграцию Apache Camel с сервером приложений WildFly. Это позволяет вам добавить верблюжьи маршруты как часть конфигурации WildFly. Маршруты могут быть развернуты как часть приложений Java EE. Компоненты Java EE могут получить доступ к API-интерфейсу Camel Core и различным API-интерфейсам Camel Component. Ваше решение Enterprise Integration Solution может быть спроектировано как комбинация функций Java EE и Camel.

Примечание: ожидается, что последняя версия WildFly 9 будет поддерживаться выпуском 3.x WildFly-Camel.

Готовиться 

Скачайте и распакуйте WildFly 8.2.0.Final  в папку по вашему выбору. Загрузите и разархивируйте  патч wildfly-camel (2.3.0) в папку wildfly. Запустите WildFly с

bin/standalone[.bat|.sh] -c standalone-camel.xml

Один из самых быстрых способов начать работу с Docker и изображением  WildFly Camel . Этот образ поставляется в комплекте с WildFly 8.1 и уже установленной подсистемой Camel. 

Определение и использование верблюжьего контекста

CamelContext представляет собой одну из правил маршрутизации Camel. Вы используете CamelContext аналогично Spring ApplicationContext. Он содержит все маршруты для вашего приложения. Вы можете иметь столько CamelContexts, сколько необходимо, если у них разные имена. WildFly-Camel позволяет вам определять их как а) в  standalone-camel.xml и domain.xml  как часть самого определения подсистемы и б) или развертывать их в  поддерживаемом артефакте развертывания, который содержит суффикс-  файл -camel-context.xml и c) он может быть предоставлен вместе с маршрутами через  RouteBilder и интеграцию CDI .

Определенный CamelContext может быть использован двумя различными способами: a)  @ Injected через Camel-CDI  или b) доступ из  дерева JNDI

Пример контекста и маршрут

В следующих примерах я использую контекст со связанным маршрутом, который предоставляется через CDI и RouteBuilder. Это компонент приложения, который автоматически запускается при запуске приложения. Аннотация @ContextName дает конкретное имя для CamelContext.

@ApplicationScoped
@Startup
@ContextName("cdi-context")
public class HelloRouteBuilder extends RouteBuilder {

    @Inject
    HelloBean helloBean;

    @Override
    public void configure() throws Exception {
        from("direct:start").transform(body().prepend(helloBean.sayHello()).append(" user."));
    }
}

Сам маршрут не совсем сложный. Он берет пустое тело сообщения из direct: start и добавляет результат из bean-метода CDI «sayHello» и добавляет строку «user». к этому. Для справки, полный код можно найти на  моей учетной записи GitHub . Итак, все, что нам нужно выяснить, это как использовать этот маршрут в различных спецификациях компонентов Java EE.

Использование Camel From CDI

Camel поддерживает CDI начиная с версии 2.10. До и вне подсистемы ее нужно было загрузить. Это больше не нужно, и вы можете просто использовать развернутый или определенный CamelContext в компоненте @Named CDI, просто @Injecting его по имени:

@Inject
    @ContextName("cdi-context")
    private CamelContext context;

Использование Camel From JSF, JAX-RS и EJB

Зная, как использовать CamelContext в CDI, вы можете предположить, что легко сделать то же самое из JSF и так далее. Это неправда. Вы на самом деле не можете внедрить его в ManagedBeans или даже в CDI Beans, которые связаны с компонентом JSF. Плюс это не работает в EJB. Я не рассматривал это подробно, но предполагаю, что это как-то связано с областями видимости. Разумный обходной путь и, фактически, лучший дизайн приложения — это поместить полную логику Camel в отдельный компонент CDI и просто внедрить это.

@Named
public class HelloCamel {

    @Inject
    @ContextName("cdi-context")
    private CamelContext context;

    private final static Logger LOGGER = Logger.getLogger(HelloCamel.class.getName());

    public String doSomeWorkFor(String name) {

        ProducerTemplate producer = context.createProducerTemplate();
        String result = producer.requestBody("direct:start", name, String.class);
        LOGGER.log(Level.INFO, result);
        return result;
    }
}

Интерфейс  ProducerTemplate  позволяет отправлять обмен сообщениями на конечные точки различными способами, чтобы упростить работу с экземплярами Camel Endpoint из кода Java. В этом конкретном случае он просто запускает маршрут и помещает строку в тело, которая представляет имя компонента, из которого я его использую.

Компонент CDI, который действует как компонент поддержки для компонента, просто использует его:

@Inject
    HelloCamel helloCamel;

    public String getName() {
        return helloCamel.doSomeWorkFor("JSF");
    }

Возвращаемая строка — «Привет, пользователь JSF». Который также записывается в журнал сервера WildFly. Тот же подход является лучшим для всех других компонентов Java EE.

Использование верблюда из EJB

Если вы используете EJB в качестве модели компонентов приложения man, также очень разумно просто использовать подход JNDI: 

 CamelContext camelctx = 
                (CamelContext) inicxt.lookup("java:jboss/camel/context/cdi-context");

Hawtio — Консоль верблюда

Еще одна скрытая жемчужина в подсистеме — это комплектация   консоли Hawtio . Это модульная веб-консоль для управления вашими Java-компонентами и имеет плагин Apache Camel, который визуализирует ваши контексты и маршруты. Помните, что он автоматически настроен для обеспечения безопасности, и вам необходимо добавить управляющего пользователя, прежде чем вы сможете получить к нему доступ.

Дальнейшее чтение и помощь

Поговорите с разработчиками на Freenode 

Документация по подсистеме WildFly-Camel

WildFly Camel на GitHub

Веб-сайт Apache Camel