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

JDBC XA DataSource as OSGI Service

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


Итак, берем последнюю версию ServiceMix, на момент написания статьи это версия 4.4.2. В этой версии ServiceMix использует Apache Camel 2.8.5, версия старая, но для нас абсолютно не критично.

Для того чтобы устанавливать проложения под ServiceMix, необходим правильный способ сборки. Создаем в Eclipse проект Maven на основе архетипа camel-archetype-spring-dm, в результате будет создан проект, который собирается в osgi bundle и после сборки полностью готовый к установке на ServiceMix. Тут важно при создании проекта установить версию Apаche Camel 2.8.5, которая соответствует версии в ServiceMix, иначе у нас возникнут проблемы при запуске нашего модуля. Отличие от архетипа, которым мы пользовались до этого сосредоточены в pom.xml:

Установлен тип сборки bundle
<packaging>bundle</packaging>
Добавлен новый плагин
<plugin>
 <groupId>org.apache.felix</groupId>
 <artifactId>maven-bundle-plugin</artifactId>
 <version>2.3.4</version>
 <extensions>true</extensions>
 <configuration>
  <instructions>
   <Bundle-SymbolicName>datasources</Bundle-SymbolicName>
   <Private-Package>com.bssys.datasources.*</Private-Package>
   <Import-Package>*,org.apache.camel.osgi</Import-Package>
  </instructions>
 </configuration>
</plugin>
После команды mvn build в папке target будет сгенерирован модуль готовый к развертыванию.
На самом деле в этом моделе Camel нам и не нужен. В файле camel-context.xml удаляем дефолтный маршрут, и вместо него описываем нужный нам DataSource. У себя в проекте в качестве базы данных используется Oracle, поэтому для примера возьмем именно его.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
 license agreements. See the NOTICE file distributed with this work for additional 
 information regarding copyright ownership. The ASF licenses this file to 
 You under the Apache License, Version 2.0 (the "License"); you may not use 
 this file except in compliance with the License. You may obtain a copy of 
 the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
 by applicable law or agreed to in writing, software distributed under the 
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
 OF ANY KIND, either express or implied. See the License for the specific 
 language governing permissions and limitations under the License. -->

<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"
 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">

 <bean id="oracleXADataSource" class="oracle.jdbc.xa.client.OracleXADataSource">
  <property name="URL" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
  <property name="user" value="user" />
  <property name="password" value="password" />
 </bean>

 <osgi:service id="xaDataSource" ref="oracleXADataSource"
  interface="javax.sql.XADataSource">
  <osgi:service-properties>
   <entry key="oracle.xa.datasource.name" value="oracleXA" />
  </osgi:service-properties>
 </osgi:service>

 <bean id="helloBean" class="com.bssys.datasources.HelloBean">
  <property name="say" value="Hi from Camel" />
 </bean>
</beans>
Самая интересная часть это описание OSGI-сервиса, который ссылается на описанный OracleXADataSource и выставляет свойство oracle.xa.datasource.name. Свойства могут быть любыми, и нужны там нам чтобы в дальнейшем выбирать нужный OSGI-сервис. Как это сделать будет описано далее.
Выставленный как OSGI-сервис XA-DataSource в ServiceMIx автоматически оборачивает в обертку Apache Aries Auto-Enlisting XA Wrapper. Более подробно можно почитать в документации http://fusesource.com/docs/esbent/7.0/camel_tx/XaJdbc-AutoEnlist.html. После этого выполняем команду:
mvn build
Забираем собранный модуль из папки проекта target, и закидываем его в папку deploy в ServiceMix.
Если все прошло успешно, то в ServiceMix должен быть наш установленный модуль.
Можно проверить набрав в консоли:
osgi:list
[ 265] [Active     ] [            ] [Started] [   60] DataSource bundle (0.0.1.SNAPSHOT)
Видим наш установленный модуль с id=265
Проверим что наш OSGI-сервис успешно обернут:
osgi:ls 265
Среди прочего можно увидеть:
aries.xa.aware = true
Bundle-SymbolicName = datasources
Bundle-Version = 0.0.1.SNAPSHOT
objectClass = javax.sql.DataSource
oracle.xa.datasource.name = oracleXA
org.springframework.osgi.bean.name = oracleXADataSource
service.id = 261
Теперь можно получать наш DataSource по OSGI-ссылке. Как это сделать будет рассказано в моей следующей заметке.

Комментариев нет: