OSGi-fikacja oraz nowe bundle w repozytorium ServiceMix

W tym wpisie zostanie omówiony proces OSGi-fikacji artefaktów, który przechodziłem gdy uruchamiałem prostą usługę na ServiceMix, która miała śledzić zewnętrzny RSS i pobierać z niego wpisy. Postanowiłem skorzystać z camel-rss. Przykłady które były do niego załączone są wystarczające by stworzyć odpowiedniego konsumenta… Problem zaczął się gdy usiłowałem uruchomić endpoint camela w OSGi. Mimo poprawnej konfiguracji, rozwiązanych zależności otrzymywałem wyjątek: [code]java.lang.NoClassDefFoundError: Could not initialize class com.sun.syndication.feed.synd.SyndFeedImpl at com.sun.syndication.io.SyndFeedInput.build(SyndFeedInput.java:123) at org.apache.camel.component.rss.RssUtils.createFeed(RssUtils.java:34) at org.apache.camel.component.rss.RssEntryPollingConsumer.createFeed(RssEntryPollingConsumer.java:54) at org.apache.camel.component.feed.FeedEntryPollingConsumer.poll(FeedEntryPollingConsumer.java:42) at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:106) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) [/code] Naturalnie, strasznie zirytowany, wziąłem się za dochodzenie - początkowo byłem przekonany że brakuje importów w camel-rss jednakże krótkie googlowanie wskazało rozwiązanie. Winne było kilka linii w klasie PluginManager: [code language=“java”] private Class[] getClasses() throws ClassNotFoundException { // Ten ClassLoader wskazuje na bundle w którym jest zdefiniowany endpoint! ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); List classes = new ArrayList(); boolean useLoadClass = Boolean.valueOf(System.getProperty(“rome.pluginmanager.useloadclass”, “false”)).booleanValue(); for (int i = 0; i <_propertyValues.length; i++) { // Naturalnie tutaj leciał ClassNotFoundException Class mClass = (useLoadClass ? classLoader.loadClass(_propertyValues[i]) : Class.forName(_propertyValues[i], true, classLoader)); classes.add(mClass); } Class[] array = new Class[classes.size()]; classes.toArray(array); return array; } [/code] ...

March 24, 2010 · 6 min · splatch

Wprowadzenie do Apache ServiceMix 4 cz. 1

Dnia 23 lutego w ramach Warszawa JUG miałem przyjemność wraz z Tomkiem Nurkiewiczem prezentować narzędzia integracyjne z otwartym kodem źródłowym. Tomek przedstawił Mule ESB, podczas gdy ja zająłem się Apache ServiceMix i Apache Camel. Ze względu na objętość przykładu ten wpis będzie jedynie wprowadzeniem do konsoli. Niestety podczas prezentacji nie udało mi się uruchomić przykładu na “szynie” - ponieważ uniemożliwiły to zależności do bibliotek których nie miałem zapisanych lokalnie. Drugim mym przeciwnikiem był czas - nie było wielu chętnych by słuchać po 2h tłumaczeń dlaczego się nie udało :-) Na problem z zależnościami stworzyłem rozwiązanie i zgłosiłem je do Karaf-a ( FELIX 2141). W przyszłej wersji - 1.6 - wszyscy będą mogli skorzystać z polecenia features:info -t które wyświetli całe drzewko zależności potrzebnych do zainstalowania nowych funkcjonalności. ...

March 22, 2010 · 7 min · splatch