Показаны сообщения с ярлыком Apache Camel. Показать все сообщения
Показаны сообщения с ярлыком Apache Camel. Показать все сообщения

пятница, октября 14, 2016

Dynamic Webservice registration on ServiceMix

Рассмотрим как можно динамически зарегистрировать webservice на ServiceMix. В общем смысле подобным образом можно динамически регистрировать любые сервисы. Для примера реализуем простейший сервис c использованием Apache Camel. Сервис будет слушать файловую папку, в которую будет выгружаться файлы со ссылками на wsdl. Эти сервисы и будем динамически регистрировать.

Общий смысл такой. Создадим bean с методом registy который будет принимать ссылку на wsdl, создавать соответствующую конечную точку(endpoint) и динамически добавлять route, принимающий сообщения из нее.

вторник, апреля 26, 2016

ServiceMix Atomikos XA transaction JDBC JMS

Снова вернемся к важному вопросу о XA транзакциях. Рассмотрим реализацию XA транзакций с использованием популярного менеджера распределенных транзакций Atomikos. Это широко используемый диспетчер транзакций JTA с открытым исходным кодом, который предназначен для сред отличных от J2EE. Это как раз наш случай.
В данном примере будет представлена готовая конфигурация транзакций.
Приложение разделено на модули, которые разделяют настройку ресурсов, от бизнес логики. Фактически вы можете установить модули в ServiceMix и заняться разработкой, не разгребая как во многих других примерах системную и бизнес логику.
Итак модули:
  1. ts - поднимает транзакционные артефакты JtaTransactionManager, UserTransactionManager, UserTransactionImp
  2. ds - поднимает транзакционный источник данных на примере БД Oracle OracleXADataSource, AtomikosDataSourceBean
  3. amq - поднимает транзакционные артефакты для работы с JMS на примере ActiveMQ, ActiveMQXAConnectionFactory, AtomikosConnectionFactoryBean
  4. testXA - приложение для ServiceMix демонстрируещее работающие транзакции 
Контекст модуля ts определяет два бина txMgr и userTransaction. Классы реализации предоставляются Atomikos и реализуют интерфейсы TransactionManager и UserTransaction из стандарта J2EE. После этого определяется бин jtaTxMgr с классом реализации JtaTransactionManager и внедряются два бина транзакций предоставляемые Atomikos. Это информирует Spring о необходимости использования Atomikos JTA для управления транзакциями. Далее сконфигурированный менеджер транзакций выставляется как osgi-сервис, чтобы позволить другим модулям его переиспользовать.

вторник, января 12, 2016

Best practices ServiceMix and Apache Camel

В этой статье я решил поделится всеми своими рекомендациями при разработке с применением ServiceMix и Apache Camel. По мере развития статья будет дополняться.
  • Используйте Spring DSL вместо Java DSL. Это позволит в некоторых случаях при необходимости вести разработку в обычном текстовом редакторе, избавит вас от format-hell. Так же в силу древовидности XML вам не придется использовать костыли по типу end(), которые вы вынуждены вставлять чтобы контролировать блоки кода.
  • При подключении к ActiveMQ всегда используйте failover (failover:tcp://127.0.0.1:61616)
  • При использовании файлового адаптера читающего файлы из директории, всегда подключайте фильтр на проверку пустого файла.
    import org.apache.camel.component.file.GenericFile;
    import org.apache.camel.component.file.GenericFileFilter;
    import org.apache.log4j.Logger;
    
    public class EmptyFilter<T> implements GenericFileFilter<T> {
     private static Logger log = Logger.getLogger(EmptyFilter.class);
    
     public boolean accept(GenericFile<T> file) {
      boolean res = false;
      if (!file.isDirectory()) {
       if (file.getFileLength() > 0) {
        res = true;
       }
      }
      return res;
     }
    }
    
    
    Иcпользование:
    file:{{inbox}}?filter=#emptyFilter
    

понедельник, апреля 28, 2014

ActiveMQ Master/Slave and load balancer cluster

Пришло время объединить все технологии кластеризации ActiveMQ вместе, и продемонстрировать систему устойчивую к сбоям и позволяющую распределять нагрузку. Для примера построим архитектуру кластера на базе 8 инстансов ActiveMQ. Схема выглядит следующим образом.

Рассмотрим детально:

  • Инстансы связаные общим хранилищем Master/Slave 1-2, 3-4, 5-6, 7-8. По идее каждая пара разворачивается на отдельной машине. Для возможности развертывания на отдельной машине, все инстансы разнесены по портам.
  • С помощью Network Broker каждая пара с связана с каждой парой.
  • Для каждой пары на этом же хосте, с помощью Apache Camel поднимается HTTP точка, принимающая запросы от внешнего балансировщика и прокидывающая запрос в очередь.
  • Все инстансы из каждой группы могут делиться сообщения с другими группами
  • Отдельные клиенты разворачиваются каждый на своем хосте и читают сообщения и очереди.
  • Балансировщик для простоты тоже реализован с помощью Apache Camel
Ниже можно взглянуть на настройки каждого инстанса и исходный код.

четверг, апреля 24, 2014

ActiveMQ Master/Slave and Broker Networks cluster

В предыдущей статье мы рассмотрели высоко-нагруженый кластер ActiveMQ для распределения нагрузки. Однако эта конфигурация все таки обладает следующим недостатком. При выходе из строя одного из узлов ActiveMQ, сообщения размещенные в нем становятся более недоступны, и будут вычитаны только после того как конкретный инстанс ActiveMQ будет снова поднят. Проблема может быть решена с помощью конфигурации Master/Slave, в которой два, или больше инстанса ActiveMQ имеют общее хранилище. Пара Master/Slave может быть связана с аналогичной парой, размещенной на другом хосте, и связаны с помощью  Broker Networks. Схематично это выглядит следующим образом.
Для простоты развертывания все производится на одной машине. Инстансы ActiveMQ инстансы разделены по портам.
Ниже будут представлены настройки каждого из узлов кластера

понедельник, апреля 14, 2014

ActiveMQ high availability load balancer cluster

Рассмотрим актуальную задачу Load Balancer между инстансами ActiveMQ. Балансировка в таком случае строиться с помощью networkConnectors. Для простоты развертывания инстансы ActiveMQ развернем на одной машине, разделение будет строиться на базе портов. Вот схематичное представление кластера:

Конфигурация каждого инстанса ActiveMQ представлена ниже:

четверг, апреля 03, 2014

Transactional JMS Client

Разберемся детально с локальными транзакциями на примере взаимодействия JMS очередей (ActiveMQ). В документации по этому поводу говорится, что для того чтобы с route был транзакционным достаточно в начале объявить его с помощью инструкции <transacted/> . Но как будет выглядеть транзакционное поведение умалчивается. Обычно в качестве примера демонстрируется подобный route.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="jmstx:queue:okay"/>
      <transacted/>
      <to uri="jmstx:queue:final"/>
    </route>
  </camelContext>
</beans>
Который не демонстрирует ровным счетом ничего.

понедельник, марта 17, 2014

RESTFul with Apache Camel

После длительного перерыва, рассмотрим как реализовать с помощью Apache Camel простейший REST-сервис. Реализовать подобное с помощью Apache Camel можно навскидку 3-мя способами. Мне как раз был необходим сервис по хранению и управлению настройками в формате key=value. REST необходим чтобы в дальнейшем сделать на AngularJS страницу для управления настройками.
Итак Apache Camel предоставляет следующие возможности для реализации REST сервиса
  1. CXF Bean Component
  2. Restlet Component
  3. CXFRS Component
CXF Bean Component и CXFRS Component очень похожи друг на друга, и строятся на основе отдельного java-bean помеченного специальными аннотациями, и отличаются лишь обвязкой и инициализацией.Лично меня привлек CXF Bean Component который поддерживает из коробки одновременно два стандарта JAXRS, JAXWS. Что позволяет управлять выводом XML-JSON, плюс есть возможность использовать разработанный код для реализации SOAP WebService.
Сам код на Apache Camel очень лаконичен:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring"
 xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 <context:component-scan base-package="com.bssys.*" />
 
 <bean id="itemRestService" class="com.bssys.rest_service.ItemRestService" />
 
 <camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
   <from uri="jetty:http://localhost:8787?matchOnUriPrefix=true" />
   <to uri="cxfbean:itemRestService" />
  </route>
 </camelContext>
</beans>

Детали скрываются в реализации ItemRestService. Ниже я опишу полную последовательность разработки

четверг, января 17, 2013

Apache Camel on ServiceMix XA Transaction with database and JMS

Перейдем к одной из самых серьезных задач, без которой не может обойтись ни одна серьезная интеграционная платформа, к XA транзакциям. Для примера возьмем ситуацию близкую к реальности описанную как маршрут Apache Camel.
<camelContext xmlns="http://camel.apache.org/schema/spring">
 <!-- Transactional route -->
 <route>
  <from uri="jmstx:queue:giro" />
  <to uri="jmstx:queue:statusLog" />
  <bean ref="accountService" method="credit" />
  <bean ref="accountService" method="debit" />
 </route>
 <!-- Feeder route -->
 <route>
  <from uri="jmstx:queue:statusLog" />
  <to uri="file:Success" />
 </route>
</camelContext>
В этом маршруте описывается следующее:
  1. Принимает сообщение из JMS-очереди giro
  2. Перенаправляет сообщение в JMS-очередь statusLog, в которой должны быть только успешные сообщения
  3. Меняем состояние базы данных  
Второй маршрут описывает следующее:
  1. Принимает сообщение из JMS-очереди statusLog
  2. Сохраняет сообщение в папке Success
В ходе работы в итоговой папке Success должны находиться только успешные сообщения. При возникновении исключения, состояние в базе не меняется, и файла с транзакцией не оказывается в папке успешных сообщений. В этом примере участвуют 3 транзакционные системы JMS, database и filesystem. Как это заставить работать на ServiceMix и Apache Camel?...

среда, января 16, 2013

JDBC XA DataSource as OSGI Service

В данной заметке я расскажу как использовать базу данных в связке Apache Camel и Apache ServiceMix. Да, конечно можно описать все необходимы и бины и источники данных в конфиге Camel, но тут мы заглянем дальше. Описанные ресурсы будут участвовать в XA-транзации, и все это добро будет крутиться на ServiceMix. Это первая часть большого примера.

четверг, августа 30, 2012

Parse HTML-page and follow the link with Apache Camel

Как распарсить HTML-страницу и пройти по ссылкам с помощью Ahace Camel? Если кратко-легко! Выполним эту задачу не написав ни одной строчки кода.
На этот раз воспользуемся Spring-DSL, так как в данном случае он более лаконичен.


среда, августа 08, 2012

Calling Web Services with Apache Camel

Казалось бы, такая простая задача для интеграционной системы как вызов внешнего webservice, для Apache Camel вызывает затруднения. Прольем немного света. Вызов внешнего webservice на Apache Camel реально занимает одну строчку! Возьмем доступный всем открытый сервис погоды:
http://www.webservicex.com/globalweather.asmx?WSDL
Вот как вызвать этот сервис на Camel:
from("file:c:/data/inbox3").to("cxf:bean:calculatorWSEndpoint?defaultOperationName=GetWeather").to("file:c:/data/outbox");

Подробности под катом!

понедельник, августа 06, 2012

Apache Camel Message Processing Actions (Like OSB)


Работая в проекте с OSB, я удивился как легко и просто там работать с xml. Модификация сообщения на Oracle Service Bus действительно делается легко и непринужденно c помощью инструменов Assign, Delete, Insert. Как же наш Apache Camel? А вот в нем не все так просто. Но все необходимое у нас есть, попробуем сделать что-то подобное!

среда, мая 30, 2012

JDBC Polling Adapter c помощью Apache Camel

В качестве wiki and issue tracking system у нас используется TRAC http://trac.edgewall.org/ Появилась задача мониторинга изменения задач в этой системе. TRAC написан на Python и поддерживает из коробки только один вид нотификации-email.  Активность по тикетам в системе должна выгружаться в xml-файл для обработки другой системой. Идеальная задача для Camel ;)

пятница, марта 30, 2012

Блеск и нищета Apache Camel

В этой статье я расскажу про фееричный фейл Apache Camel , на реальной бизнес-задаче.
Возникла задача по обработке 5000000 zip-файлов (O_o). Каждый файлик необходимо распаковать, достать из архива XML файл, распарсить его, и некоторую информацию дописать в лог в определенном формате.

 Идеальная задача для Apache Camel подумал я и бросился в бой!

Файловый интерфейс для Base64 кодирования/декодирования с помощью Apache Camel

Чем мне нравится Apache Camel, так это готовыми компонентами  конечных точек(endpoints) на все случаи жизни. В моей жизни встретилась задача, по Base64 кодированию/декодированию множества файлов.

Схема работы приложения следующая:
В соответствующие папки будут кидаться файлики, результат будет формироваться в папке output:

c://data/encode
c://data/decode

c://data/output

Идеальная задача для Apache Camel!

четверг, марта 29, 2012

Реализация Webservices с использованием Apache Camel и CXF


В этой статье рассмотрим как можно использовать вебсервисы cxf с использованием Apache Camel в качестве транспорта.
Наш роутер будет работать с сообщением как с JAXB Объктом.
Первым делом создадим Maven-проект на основе camel-archetype-java. У вас должен быть установлен соответствующий плагин для Eclipse