Недавно я начал проводить значительные исследования в области ServiceMix 4 и OSGi (в частности, Spring Dynamic Modules), и мне интересно узнать о возможностях, которые вы можете получить, комбинируя их. Я играл с примерами приложений и просматривал код, стоящий за ServiceMix 4 и Spring DM, и я решил поделиться некоторыми своими выводами.
В этой партии We’l л взглянуть на пример приложения , который сочетает в себе стиль RESTful веб — служб и Spring Dyn AMIC модулей (Spring DM).
Одним из способов предоставления RESTful-услуг из ServiceMix является использование компонентов CXF , поставляемых с продуктом. Как объясняется здесь , CXF предоставляет различные способы предоставления сервисов RESTful. Для примера приложения я буду использовать API JAX-RS (JSR-311) для демонстрации примера приложения Weather, поставляемого с Spring Dynamic Modules, из FUSE ESB 4.0 Preview (ServiceMix 4).
Ингреди нц
- Progress FUSE ESB 4.0 Предварительный просмотр
- Spring Dynamic Modules 1.2.0 M1
- Java 1.5+
- Maven 2.0.9
- CXF-SpringDM-Weather Пример приложения SVN Repository
- Клиент Subversion ( командная строка SVN , Tortoisevn )
ПРОГРЕСС ПРЕДОХРАНИТЕЛЬ ESB 4.0 Назад IEW Конфигурация
- Скачайте Progress FUSE ESB 4. 0 Предварительный просмотр по ссылке выше и установите его. Установка продукта действительно проста, и выбор конфигурации по умолчанию должен быть просто идеальным.
- Перейдите в каталог примеров продукта FUSE ESB и соберите проект cxf-osgi. Этот шаг подготавливает ваш локальный репозиторий Maven с артефактами, необходимыми для создания примера приложения. Если вы выполните следующее , у вас все будет хорошо: mvn install
Весна Dyna микрофон Мода ле Инстал ляционный
- Скачайте Spring Dynamic Modules по ссылке выше и установите его. Для примера я предполагаю, что каталог установки — C: \ dev \ spring-osgi-1.2.0-m1
- Перейдите в каталог примеров (C: \ dev \ spring-osgi-1.2.0-m1 \ src \ samples) дистрибутива Spring DM и выполните: mvn -Dmaven.test.skip = true clean install -P fe lix Этот шаг поможет с развертыванием службы погоды из консоли ServiceMix.
Установка и сборка примера приложения
- Используя клиент Subversion, ознакомьтесь с примером приложения отсюда: VN Repository должен был предоставить URL-ссылку вместо самого URL-адреса, чтобы избежать переноса слов, вызванного таким длинным URL-адресом. Вы можете открыть браузер по указанному выше URL-адресу, скопировать и вставить адрес в свой клиент SVN. Я предполагаю, что код будет извлечен в каталог C: \ dev \ cxf-springdm-weather
- Установите необходимые пакеты для примера приложения. Из каталога C: \ dev \ cxf-springdm-weather \ lib выполните следующую команду:
mvn install:install-file -DgroupId=javax.ws.rs -DartifactId=jsr311-osgi-api -Dversion=0.8 -Dpackaging=jar -Dfile=jsr311-osgi-api-0.8.jar
- Перейдите в каталог C: \ dev \ cxf-springdm-weather и соберите приложение с помощью: vn clean install, если все будет хорошо, maven создаст целевой каталог с файлом jar с именем cxf-springdm-weather-4 .0.0 0,0-fuse.jar
Развертывание
Реализация JAX-RS в CXF
зависит от двух jar-пакетов OSGI (jettison-1.0.1.jar и jsr311-osgi-api-0.8.jar). Мне пришлось конвертировать эти jar-файлы в пакеты OSGi, и я предоставляю их в каталоге lib примера приложения, чтобы вам не пришлось конвертировать их самостоятельно.
Вот как вы можете развернуть пример приложения из консоли ServiceMix. Эти шаги используют команду «osgi» для установки и запуска необходимых пакетов:
- Запуск ServiceMix Ke г NEL, запустив в / ServiceMix п корневой директории распределения ПРЕДОХРАНИТЕЛЬ ESB.
- установочный файл osgi: / C: /dev/cxf-springdm-weather/lib/jettison-1.0.1.jar
- установить файл -sgi: / C: /dev/cxf-springdm-weather/lib/jsr311-osgi-api-0.8.jar
- Используйте команду «osgi list», чтобы найти идентификатор пакета для пакета с именем «Apache CXF Bundle Jar (2.1.1.fuse)» и выполнить команду «osgi refresh». В моей системе идентификатор пакета равен 56, поэтому я использовал команду : o sgi refresh 56.
- osgi install -s mvn: org.springframework.osgi.samples / weather-dao / 1.2.0-m1
- osgi install -s mvn: org.springframework.osgi.samples / weather-service / 1.2.0-m1
- Установка -sgi -s файл: / C: / dev / cxf-s pringdm-weather / target / cxf-springdm-weather-4.0.0.0-fuse.jar
На этом этапе вы должны увидеть вывод, похожий на этот, в консоли ServiceMix:
servicemix> Instantiating org.apache.servicemix.examples.restful.springdm.WeatherServiceFrontEnd
class org.apache.servicemix.examples.restful.springdm.WeatherServiceFrontEnd setting weatherService: org.springframework.osgi.samples.weather.service.WeatherServiceImpl@5c0dbc55
Sep 12, 2008 10:41:40 AM org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the server's publish address to be /weather
Тестирование T он Применение
Теперь просто откройте ваш браузер и перейдите по следующему адресу:
http: // localhost: 8080 / cxf / weather / service / history-high / 11-11-2002
Дата должна быть в формате мм-дд-гггг . Если вы укажете недопустимую дату, исключение будет отображаться в консоли ServiceMix, а сегодняшняя дата будет использоваться для обработки. наш браузер должен отобразить это:
Пример кода приложения
На следующей диаграмме показан поток запросов / ответов примера приложения. Обратите внимание, что компонент CXF служит прокси между компонентом HTTP / WS и компонентом WeatherServiceFrontEnd. Аналогичным образом Spring DM служит прокси для зарегистрированных служб OSGi, в данном случае службы Weather-Service и службы Weather-dao.
Spring ЛПР We Ather A РИМЕНЕНИЕ
Для начала позвольте мне немного рассказать о приложении-образце погоды Spring DM.
Приложение Spring DM Weather поставляется с некоторыми другими пакетами OSGi, но нам нужны были только пакеты Weather-Service и Weather-Dao для примера applciation.f. Вы смотрите в файле контекста eather / src / main / resources / META-INF / В spring / weather-service-context.xml вы найдете тег <osgi: service ref = «weatherService» > …. </ osgi: service> . Этот тег регистрирует bean-компонент weatherService (определенный в том же файле контекста) в реестре OSGi. Позже мы рассмотрим, как мы получаем ссылку на этот сервис и внедряем его в наш компонент веб-сервиса RESTful.
Пакет cxf-springdm-weather (внешний интерфейс примера приложения) зависит от сервиса, предоставляемого пакетом метеорологического обслуживания, а пакет метеорологического сервиса зависит от сервиса, предоставляемого пакетом weather-dao. Это типичный дизайн приложений, использующих преимущества модульности, предоставляемой OSGi. Конечно, Spring DM позволяет легко реализовать такой дизайн, применяя принципы IoC.
WeatherServiceFrontEnd Bean
Со стороны CXF / JAX-RS мы начнем изучать класс org.apache.servicemix.examples.restful.springdm.WeatherServiceFrontEnd. Этот класс является не чем иным, как POJO с аннотациями JAX-RS и зависимостью от объекта, реализующего интерфейс org.springframework.osgi.samples.weather.service.WeatherService. Экземпляр этого интерфейса будет внедрен с использованием Spring DM.
В двух словах, JAX-RS представляет собой комбинацию аннотаций, которые помогают сопоставить параметры запроса URI и HTTP с POJO. @Path («/ service /») отображает URL-адрес сразу после / cxf, который является корнем этого приложения, как мы указали его в файле контекста xbeans.xml. Мы поговорим о конфигурации в файле контекста через минуту. @ProduceMime («application / xml») говорит, что это приложение будет возвращать данные XML.
Если вы посмотрите на метод getHistoricalHighForDate (…), вы заметите, что здесь мы использовали некоторые другие аннотации JAX-RS. @Path («/ исторический-высокий / {дата}») отображает это в URI под / cxf / weather / service. @PathParam («date») отображает {date}, указанный выше @Path, в аргумент метода getHistoricalHighForDate. Я специально не использовал XML API, чтобы сделать код примера приложения более легким для чтения и отслеживания. Как видите, код действительно прост, и все, что он делает, — это делегирует вызов реализации WeatherService и заключает в строку XML результаты. Более подробную информацию о JAX-RS и о том, как он используется с CXF, можно найти здесь.
Примечание : JAX-RS должен знать, какая реализация JAX-RS будет использоваться. Это делается путем создания файла calle d «javax.ws.rs.ext.RuntimeDelegate «в каталоге META-INF / services. Содержимое файла задает имя класса, выполняющего эту реализацию.
Образец файла контекста приложения
Файл контекста, расположенный в META-INF / spring / xbean.xml, используется для настройки службы RESTful, CXF и внедрения службы погоды. В начале файла контекста вы найдете обычные определения пространств имен, в том числе для JAX-RS и Spring DM. Затем есть набор импортов контекста:
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
<import resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml" />
Эти импорты настраивают транспорт HTTP CXF, перехватывают JAX-RS с CXF и настраивают CXF в ServiceMix и контейнере OSGi.
Затем есть определение bean-компонента WeatherServiceFrontEnd.
<bean id="weatherServiceFrontEnd" class="org.apache.servicemix.examples.restful.springdm.WeatherServiceFrontEnd" >
<property name="weatherService">
<springdm-osgi:reference interface="org.springframework.osgi.samples.weather.service.WeatherService" timeout="5000" />
</property>
</bean>
Именно здесь магия Spring DM и Spring IoC используется для добавления службы погоды в компонент обслуживания погоды RESTful.
<Springdm-OSGi: ссылка … > Тег находит службу в OSGi реестре с интерфейсом org.springframework.osgi.samples.weather.service.WeatherService и впрыскивает его к weatherService свойству org.apache.servicemix. examples.restful.springdm.WeatherServiceFrontEnd bean. Наконец, конфигурация веб-службы RESTful путем сопоставления ее с URI «/ cxf / weather» с использованием атрибута адреса тега компонента JAX-RS:
<jaxrs:server id="weatherService" address="/weather" >
<jaxrs:serviceBeans>
<ref bean="weatherServiceFrontEnd" />
</jaxrs:serviceBeans>
</jaxrs:server>
Как видно из приведенного выше фрагмента кода, ссылка на компонент WeatherServiceFrontEnd внедряется в компонент JAX-RS.
OSGi Bundles
Последнее, что нужно объяснить, — как помочь контейнеру OSGi найти необходимые классы для различных пакетов приложения. Обычно это делается путем указания импорта / экспорта пакета в файле META-INF / MANIFEST.MF. Если вы внимательно посмотрите на предоставленный файл pom.xml, вы заметите, что я использую конкретный артефакт ServiceMix 4 в качестве родителя для этого проекта. Это связано с тем, что я использовал один из примеров файла pom.xml в качестве отправной точки для этого проекта. Я предполагаю, что в будущем FUSE ESB 4.0, как и его предшественник, будет иметь архетипы maven, чтобы облегчить запуск новых проектов. Вернувшись к проекту maven, подключаемый модуль maven-bundle-plugin используется для создания файла MANIFEST.MF для нас. Это делается в тот момент, когда приложение создается процессом сборки maven.Все, что нам нужно сделать, это указать пакеты для импорта / экспорта в разделе конфигурации плагина. Там вы найдете пакеты JAX-RS, CXF, службы погоды и другие.или более подробный обзор пакетов OSGi, посетите блог Костина Лиу .
Заключительные слова
Комбинация ESB-подобного ServiceMix поверх контейнера OSGi, и все это благодаря гибкости и простоте использования Spring Dynamic Modules делает этот продукт интересным для использования в ваших задачах по интеграции корпоративных приложений.
Я с нетерпением жду выхода GA продукта FUSE ESB 4.0.
Рекомендуемое чтение
- Progress FUSE ESB 4 Предварительный просмотр документации
- Справочник динамических модулей Spring
- Блог Рода Биреша
- Блог Стива Смита
- Блог Джеймса Страчана
- Блог Гийома Ноде
- Блог Костина Лиу