Статьи

Миграция с Spring dm Server

Самый простой способ разработки приложений OSGi на основе Spring — это использование SpringSource Tools (плагин Eclipse) и SpringSource dm Server combo. Они обеспечивают быструю разработку, такую ​​как проверка MANIFEST.MF, удобное развертывание и автоматическая загрузка необходимых (и OSGi-ориентированных) библиотек. Позже, когда вам нужно перейти на обычный OSGi (как и я), вы можете следовать этой серии руководств.

Месяц назад я начал разработку приложения с использованием SpringSource dm Server (ssdms) . В середине проекта возникли опасения по поводу его развертывания в «простом» контейнере OSGi (а именно в Equinox ). Миграция была непростой, поэтому я решил опубликовать ее в блоге, чтобы поделиться.

Сначала я скачал голую «Рамку» из Eclipse . Версия «Eclipse Equinox» (в списке самых верхних) — это Framework +, но я не использовал ее, так как хотел собрать все с нуля (и он наполнен старыми Servlet 2.4 и Jetty 5).

Фреймворк представляет собой jar-файл <1 МБ, запускаемый с помощью «java -jar JARNAME.JAR -console». Это было не очень интересно, поэтому следуя инструкциям в Руководстве по быстрому запуску (потратьте некоторое время на чтение последнего раздела, оно того стоит), я загрузил собственный пусковой механизм для моего Mac с той же страницы загрузки.

Примечание для пользователей Mac: поскольку это тот же модуль запуска, который используется в Eclipse IDE, он не работает в 64-разрядной версии Java 6. Также не делает версию Какао.

Проверьте структуру, запустив ее. В консоли osgi> введите ss. Он покажет один активный пакет (который является самой структурой). Типа близко к выключению.

osgi> ss

Framework is launched.

id	State       Bundle
0	ACTIVE      org.eclipse.osgi_3.4.0.v20080605-1900

Если вы хотите включить JMX, откройте eclipse.ini (он находится в Eclipse.app, если вы используете Mac) и добавьте следующие записи:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6789
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Запустите jconsole из терминала или командной строки (при условии, что в вашем пути указан JDK / bin) и введите service: jmx: rmi: /// jndi / rmi: // localhost: 6789 / jmxrmi в URL JMX. Вы должны увидеть «внутри» фреймворка:

Следующий шаг — заполнить его библиотеками. Самый простой способ — скопировать из дистрибутива ssdms наши эквиноксы / плагины:

  • Каждая банка в / lib, КРОМЕ :

    • Банки начались с com.springsource.server
    • Банки с slf4j, если вы хотите «унифицированную» регистрацию, как я (объясню позже)
    • Jars начались с org.eclipse.osgi, потому что они могут конфликтовать с нашей средой OSGi
  • Каждый jar в / репозиторий / bundles / ext ИСКЛЮЧИТЬ :

    • Банки, имеющие slf4j и все, что связано с любой структурой журналирования (commons-logging, Log4J), если вы хотите «унифицированную» регистрацию
    • Банки, имеющие -sources, если вы не хотите сохранить исходный код
    • Jars начали с org.springframework.osgi, потому что мы будем использовать те из дистрибутива Spring Dynamic Modules
  • Каждый jar в / репозиторий / bundles / usr ИСКЛЮЧИТ :

    • Банки, имеющие slf4j и все, что связано с любой структурой журналирования (commons-logging, Log4J), если вы хотите «унифицированную» регистрацию
    • Банки, имеющие -sources, если вы не хотите сохранить исходный код

Что такое «унифицированная» регистрация? Ну, вы можете захотеть объединить ваши средства ведения журнала, чтобы быть таким:

По сути все идет в одну раковину, облегчая администрирование. В любом случае регистрация заслуживает отдельной записи в блоге, поэтому я пропущу ее сейчас. Давайте загрузим Spring Dynamic Modules и скопируем следующие файлы jar из / dist в наши плагины / Equinox:

  • весна-OSGi-ядро-VERSION.jar
  • весна-OSGi-расширитель-VERSION.jar
  • весна-OSGi-ю-VERSION.jar
  • весна-OSGi-веб-VERSION.jar
  • весна-OSGi-веб-расширитель-VERSION.jar

Примечание. На данный момент вы можете использовать (скачать и поместить в / plugins) любую библиотеку каркаса журналов по вашему выбору. Позже, когда вы решите использовать унифицированный подход, вы должны заменить их мостами SLF4J.

Вы определенно захотите, чтобы динамические модули Tomcat и Spring работали каждый раз, когда запускается фреймворк. Вы можете перейти к консоли и запустить их вручную (платформа запоминает последние активные пакеты при завершении работы и запустит их при следующем запуске), или вы можете перечислить их в /configuration/config.ini. Последнее предпочтительнее, так как вы можете «сбросить» каркас (удалить всю конфигурацию и кеш) и при этом запустить нужные пакеты при запуске. Для этого поместите следующую запись:

osgi.bundles=org.eclipse.equinox.common@2:start, org.eclipse.update.configurator@3:start, 
catalina.start.osgi-VERSION.jar@3:start, spring-osgi-extender-VERSION.jar@4:start,
spring-osgi-web-extender-VERSION.jar@4:start
eclipse.ignoreApp=true
osgi.noShutdown=true

Проверьте нашу конфигурацию, снова запустив фреймворк. Вы должны увидеть журналы активности Tomcat и Spring Dynamic Modules. Более или менее вы должны увидеть что-то вроде этого:

14:48 Start Thread I  o.s.o.w.t.i.Activator - Starting Apache Tomcat/6.0.18 ...
14:48 Start Thread I  o.s.o.w.t.i.Activator - Using default XML configuration bundleresource://3/conf/default-server.xml
Mar 11, 2009 2:48:09 PM org.apache.catalina.startup.ClusterRuleSetFactory getClusterRuleSet
INFO: Unable to find a cluster rule set in the classpath. Will load the default rule set.
14:48 t Dispatcher I  o.s.o.e.i.a.ContextLoaderListener - Starting [org.springframework.osgi.extender] bundle v.[1.2.0.m2]
Mar 11, 2009 2:48:09 PM org.apache.coyote.http11.Http11AprProtocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Mar 11, 2009 2:48:09 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 227 ms
Mar 11, 2009 2:48:09 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Mar 11, 2009 2:48:09 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.18
Mar 11, 2009 2:48:09 PM org.apache.coyote.http11.Http11AprProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
14:48 Start Thread I  o.s.o.w.t.i.Activator - Succesfully started Apache Tomcat/6.0.18 @ Catalina:8080
14:48 Start Thread I  o.s.o.w.t.i.Activator - Published Apache Tomcat/6.0.18 as an OSGi service
14:48 t Dispatcher I  o.s.o.e.i.s.ExtenderConfiguration - No custom extender configuration detected; using defaults...
14:48 t Dispatcher I  o.s.s.t.TimerTaskExecutor - Initializing Timer
14:48 t Dispatcher I  o.s.s.t.TimerTaskExecutor - Initializing Timer
14:48 t Dispatcher I  o.s.o.w.e.i.a.WarLoaderListener - Starting [org.springframework.osgi.web.extender] bundle v.[1.2.0.m2]
14:48 xtender-Init I  o.s.o.w.e.i.a.WarListenerConfiguration - No custom extender configuration detected; using defaults...
14:48 xtender-Init I  o.s.o.w.d.t.TomcatWarDeployer - No Catalina Service set; looking for one in the OSGi service registry...
14:48 xtender-Init I  o.s.o.w.d.t.TomcatWarDeployer - Found service Catalina

Вот и все, позже я напишу о том, как заставить EclipseLink JPA работать (динамически!) И интегрировать BlazeDS для Flex Remoting.

С http://www.jroller.com/wiradikusuma/