Using infinispan in an OSGi container
sellhorn Jul 13, 2010 11:38 PMHi! I can't find any information about using Infinispan in an OSGi container.
Here's what I've done so far, inside a Felix like OSGi container (karaf running on felix) I've installed the following maven artifacts;
org.infinispan/infinispan-core/4.0.0-FINAL
jgroups/jgroups/2.9.0.GA
org.jboss.javaee/jboss-transaction-api/1.0.1.GA
org.jboss.marshalling/river/1.2.0.GA
org.jboss.marshalling/marshalling-api/1.2.0.GA
org.jboss/jboss-common-core/2.2.14.GA
org.rhq.helpers/rhq-pluginAnnotations/1.4.0.B01
Since none of these packages are proper OSGi bundles, I installed them using the wrap command, ex:
install -s wrap:mvn:org.infinispan/infinispan-core/4.0.0.FINAL
Everything loads and goes to "Active" state.
Now I create a sample OSGi project, all the activator does is this;
public void start(BundleContext context) throws Exception {
System.out.println("Cache Start");
try
{
System.out.println("Creating cache");
org.infinispan.manager.DefaultCacheManager manager =
new org.infinispan.manager.DefaultCacheManager();
manager.getCache();
}
catch (Throwable ex)
{
System.out.println("Failed to start cache!");
ex.printStackTrace();
}
}
Here is what this bundle information looks like (for the test);
InfinispanTest Bundle (203)
----------------------------
Manifest-Version = 1.0
Export-Package = test.infinispan;uses:="org.infinispan,org.jboss.marshalli
ng.river,org.osgi.framework,org.infinispan.manager"
Built-By = SellhoAu
Tool = Bnd-0.0.357
Bundle-Name = InfinispanTestOSGi Bundle
Created-By = Apache Maven Bundle Plugin
Bundle-Version = 1.0.0.SNAPSHOT
Build-Jdk = 1.6.0_16
Bnd-LastModified = 1279075996419
Bundle-ManifestVersion = 2
Bundle-Activator = test.infinispan.Activator
Import-Package = test.infinispan,org.infinispan,org.infinispan.manager,org
.jboss.marshalling.river,org.osgi.framework;version="1.5"
Bundle-SymbolicName = test.infinispan
When I start the bundle, it fails on getCache() (it can create the manager)
====================================================================================
org.infinispan.CacheException: Unable to invoke method public void org.infinispa
n.marshall.VersionAwareMarshaller.start() on object
at org.infinispan.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.ja
va:173)
at org.infinispan.factories.AbstractComponentRegistry$PrioritizedMethod.
invoke(AbstractComponentRegistry.java:852)
at org.infinispan.factories.AbstractComponentRegistry.internalStart(Abst
ractComponentRegistry.java:672)
at org.infinispan.factories.AbstractComponentRegistry.start(AbstractComp
onentRegistry.java:574)
at org.infinispan.factories.GlobalComponentRegistry.start(GlobalComponen
tRegistry.java:131)
at org.infinispan.factories.ComponentRegistry.start(ComponentRegistry.ja
va:135)
at org.infinispan.CacheDelegate.start(CacheDelegate.java:311)
at org.infinispan.manager.DefaultCacheManager.createCache(DefaultCacheMa
nager.java:507)
at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManag
er.java:473)
at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManag
er.java:446)
at ge.energy.ssi.om.core.OMActivator.start(OMActivator.java:32)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(Bund
leContextImpl.java:783)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActiv
ator(BundleContextImpl.java:774)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(Bund
leContextImpl.java:755)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(Bundl
eHost.java:352)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:280)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(Abstrac
tBundle.java:272)
at org.apache.felix.karaf.shell.osgi.StartBundle.doExecute(StartBundle.j
ava:29)
at org.apache.felix.karaf.shell.osgi.BundlesCommand.doExecute(BundlesCom
mand.java:49)
at org.apache.felix.karaf.shell.console.OsgiCommandSupport.execute(OsgiC
ommandSupport.java:41)
at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(Abstract
Command.java:35)
at org.apache.felix.gogo.runtime.shell.CommandProxy.execute(CommandProxy
.java:50)
at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:229)
at org.apache.felix.gogo.runtime.shell.Closure.executeStatement(Closure.
java:162)
at org.apache.felix.gogo.runtime.shell.Pipe.run(Pipe.java:101)
at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:79)
at org.apache.felix.gogo.runtime.shell.CommandSessionImpl.execute(Comman
dSessionImpl.java:71)
at org.apache.felix.karaf.shell.console.jline.Console.run(Console.java:1
81)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.infinispan.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.ja
va:170)
... 29 more
Caused by: org.infinispan.CacheException: Unable to load JBoss Marshalling marsh
aller factory org.jboss.marshalling.river.RiverMarshallerFactory
at org.infinispan.marshall.jboss.JBossMarshaller.start(JBossMarshaller.j
ava:102)
at org.infinispan.marshall.VersionAwareMarshaller.start(VersionAwareMars
haller.java:75)
... 34 more
Caused by: java.lang.ClassNotFoundException: org.jboss.marshalling.river.RiverMa
rshallerFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(Con
textFinder.java:129)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at org.infinispan.util.Util.loadClass(Util.java:56)
at org.infinispan.util.Util.getInstance(Util.java:86)
at org.infinispan.marshall.jboss.JBossMarshaller.start(JBossMarshaller.j
ava:100)
... 35 more
====================================================================================
Now my module doesn't use river directly so I shouldn't have to import it, however in the header information posted above you'll see it. I did that to test, either way I get an error.
Now on the infinispan bundle it imports (via wrap) every statically compiled package, which doesn't include river. So I manually edited it so that it imports a wildcard (everything). Still doesn't work ...
ex: (without the super long Export-Package, again this is done by wrap or bnd to be more exact)
Private-Package = .
Implementation-Title = Infinispan Core
Implementation-Version = 4.0.0.FINAL
Specification-Vendor = JBoss, a division of Red Hat
Built-By = manik
Tool = Bnd-0.0.313
Bundle-Name = wrap_mvn_org.infinispan_infinispan-core_4.0.0.FINAL
Created-By = 1.6.0_16 (Sun Microsystems Inc.)
Implementation-Vendor = JBoss, a division of Red Hat
Generated-By-Ops4j-Pax-From = wrap:mvn:org.infinispan/infinispan-core/4.0.0.FINA
L
Implementation-Vendor-Id = org.infinispan
Bundle-Version = 0
Build-Jdk = 1.6.0_17
Bnd-LastModified = 1279071183515
Bundle-ManifestVersion = 2
Specification-Title = Infinispan Core
Bundle-SymbolicName = wrap_mvn_org.infinispan_infinispan-core_4.0.0.FINAL
Import-Package = *;resolution:=optional
Specification-Version = 4.0.0.FINAL
Originally-Created-By = Apache Maven
Main-Class = org.infinispan.Version
Archiver-Version = Plexus Archiver
==================================================
Any ideas??? Or is there an OSGi enabled infinispan package out there (or a plan to do this)?
Thanks