2009/3/17 cmoulliard <[email protected]> > > Hi Guillaume, > > The stack trace shows the CGLIB tries to create a proxy and thus introspect > the beans: such introspection requires all the classes referenced on all > methods to be available. Looks like this is not the case. I have hardly > used CGLIB from inside spring-dm and I usually use only interface exports, > > >> You are right but the ActiveMqComponent is only available as a java > class > >> (not interface). Do you think that it is a good idea to request the > >> creation of a java interface for this camel component or maybe a service > >> that we can call to obtain the java class like > > public interface ServiceHelper { > > public Component getComponent(Component component) > > } > > public class ServiceHelperImpl { > > public Component getComponent(Component component) { > return (Component) new .... > } > } > > With such a service, we can use interface in the osgi service : > > <osgi:service id="activemqService" ref="activemqcomponent" > interface="ServiceHelper" /> > > <bean id="activemqcomponent" class="ServiceHelperImpl" /> > > > not class exports so that plain JDK proxies are used instead. This also > means that only classes referenced from the exported interface need to be > available. > Just use an interface for the export, or make sure you client bundle as all > the packages available... > > Does it make sense the bundle packaging the osgi:service exports also all > the spring core classes required by CGLIB like > org.springframework.core.task > ?
I think it should be doable using a RequireBundle with a visibility:=reexport, but this means the client bundle has to use a RequireBundle too. Not sure it's a good idea though. I'd like to come back to the real problem here. Why do you need a reference to the ActiveMQComponent class ? ActiveMQComponent is a camel component, so if you export the org.apache.camel.Component implemented by this component (through the JmsComponent) it should be sufficient. > > > Regards, > > Charles > > gnodet wrote: > > > > 2009/3/16 cmoulliard <[email protected]> > > > >> > >> Hi Guillaume, > >> > >> Here is the output of the command executed for the osgi bundle exporting > >> the > >> service : > >> > >> ActiveMq Broker Feature (105) provides: > >> --------------------------------------- > >> org.apache.activemq.camel.component.ActiveMQComponent > >> > > > > Try with "osgi/ls 105" it will give you all the classes exported by the > > service. > > You need all those packages as imports on your client bundle. > > Check the objectClass header associated with the exported service in this > > output. > > > > > >> > >> Nevertheless, if I change the syntax in my service like this : > >> > >> from : > >> <osgi:service id="activemqservice" ref="active-mq" > >> auto-export="all-classes"/> > >> to > >> <osgi:service id="activemqservice" ref="active-mq" > >> interface="org.apache.activemq.camel.component.ActiveMQComponent"/> > >> > >> it works except that I have a new error during proxy creation of the > >> class > >> ActiveMqComponent : > >> > >> 16:48:27,902 | ERROR | xtenderThread-16 | > OsgiBundleXmlApplicationContext > >> | > >> gatedExecutionApplicationContext 366 | Post refresh error > >> org.springframework.beans.factory.BeanCreationException: Error creating > >> bean > >> with name 'importedActiveMqService': FactoryBean threw exception on > >> object > >> creation; nested exception is java.lang.NoClassDefFoundError: > >> org/springframework/core/task/TaskExecutor > >> at > >> > >> > org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:127) > >> at java.security.AccessController.doPrivileged(Native Method) > >> at > >> > >> > org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116) > >> at > >> > >> > org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:91) > >> at > >> > >> > org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1288) > >> at > >> > >> > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:217) > >> at > >> > >> > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) > >> at > >> > >> > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) > >> at > >> > >> > org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:425) > >> at > >> > >> > org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) > >> at > >> > >> > org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$1600(AbstractDelegatedExecutionApplicationContext.java:68) > >> at > >> > >> > org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:343) > >> at > >> > >> > org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) > >> at > >> > >> > org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:308) > >> at > >> > >> > org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:138) > >> at java.lang.Thread.run(Thread.java:619) > >> Caused by: java.lang.NoClassDefFoundError: > >> org/springframework/core/task/TaskExecutor > >> at java.lang.Class.getDeclaredMethods0(Native Method) > >> at java.lang.Class.privateGetDeclaredMethods(Class.java:2427) > >> at java.lang.Class.getDeclaredMethod(Class.java:1935) > >> at > >> net.sf.cglib.proxy.Enhancer.getCallbacksSetter(Enhancer.java:627) > >> at > >> net.sf.cglib.proxy.Enhancer.setCallbacksHelper(Enhancer.java:615) > >> at > >> net.sf.cglib.proxy.Enhancer.setThreadCallbacks(Enhancer.java:609) > >> at > >> net.sf.cglib.proxy.Enhancer.createUsingReflection(Enhancer.java:631) > >> at net.sf.cglib.proxy.Enhancer.firstInstance(Enhancer.java:538) > >> at > >> > >> > net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:225) > >> at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) > >> at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285) > >> at > >> > >> > org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201) > >> at > >> > >> > org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110) > >> at > >> > >> > org.springframework.osgi.service.util.internal.aop.ProxyUtils$1.run(ProxyUtils.java:65) > >> at java.security.AccessController.doPrivileged(Native Method) > >> at > >> > >> > org.springframework.osgi.service.util.internal.aop.ProxyUtils.createProxy(ProxyUtils.java:62) > >> at > >> > >> > org.springframework.osgi.service.util.internal.aop.ProxyUtils.createProxy(ProxyUtils.java:39) > >> at > >> > >> > org.springframework.osgi.service.importer.support.AbstractServiceProxyCreator.createServiceProxy(AbstractServiceProxyCreator.java:107) > >> at > >> > >> > org.springframework.osgi.service.importer.support.OsgiServiceProxyFactoryBean.createProxy(OsgiServiceProxyFactoryBean.java:185) > >> at > >> > >> > org.springframework.osgi.service.importer.support.AbstractServiceImporterProxyFactoryBean.getObject(AbstractServiceImporterProxyFactoryBean.java:86) > >> at > >> > >> > org.springframework.osgi.service.importer.support.OsgiServiceProxyFactoryBean.getObject(OsgiServiceProxyFactoryBean.java:141) > >> at > >> > >> > org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:121) > >> ... 15 more > >> Caused by: java.lang.ClassNotFoundException: > >> org.springframework.core.task.TaskExecutor > >> at > >> > >> > org.springframework.osgi.context.internal.classloader.ChainedClassLoader.doLoadClass(ChainedClassLoader.java:126) > >> at > >> > >> > org.springframework.osgi.context.internal.classloader.ChainedClassLoader.loadClass(ChainedClassLoader.java:108) > >> at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) > >> > > > > The stack trace shows the CGLIB tries to create a proxy and thus > > introspect > > the beans: such introspection requires all the classes referenced on all > > methods to be available. Looks like this is not the case. I have > > hardly > > used CGLIB from inside spring-dm and I usually use only interface > exports, > > not class exports so that plain JDK proxies are used instead. This also > > means that only classes referenced from the exported interface need to be > > available. > > Just use an interface for the export, or make sure you client bundle as > > all > > the packages available... > > > > > >> > >> > >> gnodet wrote: > >> > > >> > Can you run the "osgi/ls xx" command on the service bundle and paste > >> the > >> > output ? > >> > > >> > 2009/3/16 cmoulliard <[email protected]> > >> > > >> >> > >> >> 1) Service > >> >> > >> >> The bundle where the service is declared (osgi:service) only import > >> this > >> >> package > >> >> > >> >> org.apache.activemq.camel.component > >> >> > >> >> 2) Referenced > >> >> > >> >> The bundle where the service will be consumed (osgi:reference) import > >> >> these > >> >> references : > >> >> > >> >> org.apache.commons.logging, > >> >> org.apache.camel, > >> >> org.apache.camel.component, > >> >> org.apache.camel.component.jms, > >> >> org.apache.activemq.camel.component;${activemq.osgi.version}, > >> >> org.apache.activemq.pool, > >> >> > >> >> but the error is alway there > >> >> > >> >> > >> >> > >> >> gnodet wrote: > >> >> > > >> >> > You don't need to export the package, as this one is exported by > the > >> >> > activemq-camel bundle. > >> >> > But you need to import additional packages such as org.apache.camel > >> and > >> >> > all > >> >> > packages that are used by the osgi service that you are trying to > >> get > >> a > >> >> > reference to. > >> >> > > >> >> > 2009/3/16 cmoulliard <[email protected]> > >> >> > > >> >> >> > >> >> >> My issue is that the name of the package is the same between > >> >> >> import-package > >> >> >> and export-package and maven felix bnd does not add export package > >> : > >> >> >> > >> >> >> <configuration> > >> >> >> > >> >> >> <manifestLocation>META-INF</manifestLocation> > >> >> >> <instructions> > >> >> >> > >> >> >> <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName> > >> >> >> > >> >> >> > >> >> > <Import-Package>org.apache.activemq.camel.component,*</Import-Package> > >> >> >> > >> >> >> > >> <Export-Package>org.apache.activemq.camel.component</Export-Package> > >> >> >> > >> >> >> <Include-Resource>src/main/resources</Include-Resource> > >> >> >> > >> >> >> > >> >> >> > >> >> > >> > <Spring-Context>*;publish-context:=false;create-asynchronously:=true</Spring-Context> > >> >> >> > >> >> >> <Private-Package></Private-Package> > >> >> >> </instructions> > >> >> >> </configuration> > >> >> >> > >> >> >> and result of the importation (no Export-Package appears) > >> >> >> > >> >> >> ActiveMq Broker Feature (103) > >> >> >> ----------------------------- > >> >> >> Manifest-Version = 1.0 > >> >> >> Bnd-LastModified = 1237215735043 > >> >> >> Tool = Bnd-0.0.255 > >> >> >> Spring-Context = > >> *;publish-context:=false;create-asynchronously:=true > >> >> >> Bundle-Name = ActiveMq Broker Feature > >> >> >> Built-By = Charlesm > >> >> >> Import-Package = org.apache.activemq.camel.component > >> >> >> Bundle-SymbolicName = reportincident.activemq > >> >> >> Bundle-Version = 1.0.0.SNAPSHOT > >> >> >> Build-Jdk = 1.6.0_12 > >> >> >> Created-By = Apache Maven Bundle Plugin > >> >> >> Bundle-ManifestVersion = 2 > >> >> >> > >> >> >> > >> >> >> > >> >> >> gnodet wrote: > >> >> >> > > >> >> >> > The reason is that for a given OSGi bundle to be able to see a > >> >> service > >> >> >> in > >> >> >> > the OSGi registry, it has to have on its classpath all the > >> classes > >> >> or > >> >> >> > interfaces exported by the target OSGi service. I suspect that > >> in > >> >> your > >> >> >> > case, your client bundle does not import all the needed > packages. > >> >> You > >> >> >> can > >> >> >> > see the exact list of classes exported using the "osgi/ls" > >> command > >> >> and > >> >> >> the > >> >> >> > list of packages imported using "packages/import" command. > >> >> >> > Make sure your bundle imports all the packages from the export > >> list. > >> >> >> > This is a drawback of using auto-export imho. > >> >> >> > > >> >> >> > 2009/3/16 cmoulliard <[email protected]> > >> >> >> > > >> >> >> >> > >> >> >> >> Hi, > >> >> >> >> > >> >> >> >> I have created an osgi bundle where the bean to expose as a > >> service > >> >> is > >> >> >> >> defined in a spring file : > >> >> >> >> > >> >> >> >> <bean id="activemq" > >> >> >> >> class="org.apache.activemq.camel.component.ActiveMQComponent"> > >> >> >> >> <property name="brokerURL" > >> >> >> >> value="vm://localhost:61616?create=false" /> > >> >> >> >> </bean> > >> >> >> >> > >> >> >> >> <osgi:service id="activemqservice" ref="activemq" > >> >> >> >> auto-export="all-classes"/> > >> >> >> >> > >> >> >> >> The service is well published. See the log here after. > >> >> >> >> > >> >> >> >> 13:18:42,058 | DEBUG | xtenderThread-16 | > >> >> >> OsgiBundleXmlApplicationContext > >> >> >> >> | > >> >> >> >> ractOsgiBundleApplicationContext 247 | Registering > >> BundleContext > >> >> as > >> >> a > >> >> >> >> bean > >> >> >> >> named bundleContext > >> >> >> >> 13:18:42,058 | DEBUG | xtenderThread-16 | > >> >> >> >> WaiterApplicationContextExecutor > >> >> >> >> | > >> >> >> >> WaiterApplicationContextExecutor 218 | Pre-refresh completed; > >> >> >> >> determining > >> >> >> >> dependencies... > >> >> >> >> 13:18:42,058 | DEBUG | xtenderThread-16 | > >> DependencyServiceManager > >> >> >> >> | > >> >> >> >> startup.DependencyServiceManager 253 | Discovered local > >> dependency > >> >> >> >> factories: [] > >> >> >> >> 13:18:42,074 | DEBUG | xtenderThread-16 | > >> >> DefaultListableBeanFactory > >> >> >> >> | > >> >> >> >> ort.DefaultSingletonBeanRegistry 214 | Creating shared > instance > >> of > >> >> >> >> singleton bean 'activemqservice' > >> >> >> >> 13:18:42,074 | DEBUG | xtenderThread-16 | > >> >> DefaultListableBeanFactory > >> >> >> >> | > >> >> >> >> ractAutowireCapableBeanFactory$1 383 | Creating instance of > >> bean > >> >> >> >> 'activemqservice' > >> >> >> >> 13:18:42,074 | DEBUG | xtenderThread-16 | > >> >> DefaultListableBeanFactory > >> >> >> >> | > >> >> >> >> stractAutowireCapableBeanFactory 459 | Eagerly caching bean > >> >> >> >> 'activemqservice' to allow for resolving potential circular > >> >> references > >> >> >> >> 13:18:42,105 | DEBUG | xtenderThread-16 | > >> >> CachedIntrospectionResults > >> >> >> >> | > >> >> >> >> beans.CachedIntrospectionResults 151 | Not strongly caching > >> class > >> >> >> >> > >> >> >> >> > >> >> >> > >> >> > >> > [org.springframework.osgi.service.importer.support.OsgiServiceProxyFactoryBean] > >> >> >> >> because it is not cache-safe > >> >> >> >> 13:18:42,105 | DEBUG | xtenderThread-16 | > >> >> DefaultListableBeanFactory > >> >> >> >> | > >> >> >> >> stractAutowireCapableBeanFactory 1367 | Invoking > >> >> afterPropertiesSet() > >> >> >> on > >> >> >> >> bean with name 'activemqservice' > >> >> >> >> 13:18:42,105 | DEBUG | xtenderThread-16 | > >> >> DefaultListableBeanFactory > >> >> >> >> | > >> >> >> >> ractAutowireCapableBeanFactory$1 411 | Finished creating > >> instance > >> >> of > >> >> >> >> bean > >> >> >> >> 'activemqservice' > >> >> >> >> 13:18:42,105 | INFO | xtenderThread-16 | > >> DependencyServiceManager > >> >> >> >> | > >> >> >> >> startup.DependencyServiceManager 278 | Adding OSGi service > >> >> dependency > >> >> >> >> for > >> >> >> >> importer [&activemqservice] matching OSGi filter > >> >> >> >> > >> >> [(objectClass=org.apache.activemq.camel.component.ActiveMQComponent)] > >> >> >> >> > >> >> >> >> Unfortunately, the osgi bundle who will consume the > osgi:service > >> >> >> >> > >> >> >> >> <osgi:reference id="activemqservice" > >> >> >> >> > >> interface="org.apache.activemq.camel.component.ActiveMQComponent" > >> >> /> > >> >> >> >> > >> >> >> >> generates an error > >> >> >> >> > >> >> >> >> 13:18:42,105 | DEBUG | xtenderThread-16 | > >> DependencyServiceManager > >> >> >> >> | > >> >> >> >> startup.DependencyServiceManager 226 | 1 OSGi service > >> >> dependencies, > >> >> 1 > >> >> >> >> unsatisfied (for beans [&activemqservice]) in > >> >> >> >> > >> OsgiBundleXmlApplicationContext(bundle=reportincident.interfaces, > >> >> >> >> config=osgibundle:/META-INF/spring/*.xml) > >> >> >> >> 13:18:42,105 | INFO | xtenderThread-16 | > >> DependencyServiceManager > >> >> >> >> | > >> >> >> >> startup.DependencyServiceManager 232 | > >> >> >> >> > >> OsgiBundleXmlApplicationContext(bundle=reportincident.interfaces, > >> >> >> >> config=osgibundle:/META-INF/spring/*.xml) is waiting for > >> >> unsatisfied > >> >> >> >> dependencies [[&activemqservice]] > >> >> >> >> 13:18:42,105 | DEBUG | xtenderThread-16 | > >> >> >> >> WaiterApplicationContextExecutor > >> >> >> >> | > >> >> >> >> WaiterApplicationContextExecutor 257 | Registering service > >> >> dependency > >> >> >> >> dependencyDetector for > >> >> >> >> > >> OsgiBundleXmlApplicationContext(bundle=reportincident.interfaces, > >> >> >> >> config=osgibundle:/META-INF/spring/*.xml) > >> >> >> >> 13:18:42,121 | DEBUG | xtenderThread-16 | > >> DependencyServiceManager > >> >> >> >> | > >> >> >> >> startup.DependencyServiceManager 297 | > >> >> >> >> > >> OsgiBundleXmlApplicationContext(bundle=reportincident.interfaces, > >> >> >> >> config=osgibundle:/META-INF/spring/*.xml) has registered > service > >> >> >> >> dependency > >> >> >> >> dependencyDetector with filter: > >> >> >> >> > >> (objectClass=org.apache.activemq.camel.component.ActiveMQComponent) > >> >> >> >> > >> >> >> >> What is the cause of this issue ? Do I have to change something > >> in > >> >> my > >> >> >> >> MANIFEST file ? > >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> ----- > >> >> >> >> Charles Moulliard > >> >> >> >> SOA Architect > >> >> >> >> > >> >> >> >> My Blog : http://cmoulliard.blogspot.com/ > >> >> >> >> http://cmoulliard.blogspot.com/ > >> >> >> >> -- > >> >> >> >> View this message in context: > >> >> >> >> > >> >> >> > >> >> > >> > http://www.nabble.com/1-OSGi-service-dependencies%2C-1-unsatisfied-%28for-beans---activemqservice-%29-in-OsgiBundleXmlApplicationContext-tp22537014p22537014.html > >> >> >> >> Sent from the ServiceMix - User mailing list archive at > >> Nabble.com. > >> >> >> >> > >> >> >> >> > >> >> >> > > >> >> >> > > >> >> >> > -- > >> >> >> > Cheers, > >> >> >> > Guillaume Nodet > >> >> >> > ------------------------ > >> >> >> > Blog: http://gnodet.blogspot.com/ > >> >> >> > ------------------------ > >> >> >> > Open Source SOA > >> >> >> > http://fusesource.com > >> >> >> > > >> >> >> > > >> >> >> > >> >> >> > >> >> >> ----- > >> >> >> Charles Moulliard > >> >> >> SOA Architect > >> >> >> > >> >> >> My Blog : http://cmoulliard.blogspot.com/ > >> >> >> http://cmoulliard.blogspot.com/ > >> >> >> -- > >> >> >> View this message in context: > >> >> >> > >> >> > >> > http://www.nabble.com/1-OSGi-service-dependencies%2C-1-unsatisfied-%28for-beans---activemqservice-%29-in-OsgiBundleXmlApplicationContext-tp22537014p22540154.html > >> >> >> Sent from the ServiceMix - User mailing list archive at > Nabble.com. > >> >> >> > >> >> >> > >> >> > > >> >> > > >> >> > -- > >> >> > Cheers, > >> >> > Guillaume Nodet > >> >> > ------------------------ > >> >> > Blog: http://gnodet.blogspot.com/ > >> >> > ------------------------ > >> >> > Open Source SOA > >> >> > http://fusesource.com > >> >> > > >> >> > > >> >> > >> >> > >> >> ----- > >> >> Charles Moulliard > >> >> SOA Architect > >> >> > >> >> My Blog : http://cmoulliard.blogspot.com/ > >> >> http://cmoulliard.blogspot.com/ > >> >> -- > >> >> View this message in context: > >> >> > >> > http://www.nabble.com/1-OSGi-service-dependencies%2C-1-unsatisfied-%28for-beans---activemqservice-%29-in-OsgiBundleXmlApplicationContext-tp22537014p22540577.html > >> >> Sent from the ServiceMix - User mailing list archive at Nabble.com. > >> >> > >> >> > >> > > >> > > >> > -- > >> > Cheers, > >> > Guillaume Nodet > >> > ------------------------ > >> > Blog: http://gnodet.blogspot.com/ > >> > ------------------------ > >> > Open Source SOA > >> > http://fusesource.com > >> > > >> > > >> > >> > >> ----- > >> Charles Moulliard > >> SOA Architect > >> > >> My Blog : http://cmoulliard.blogspot.com/ > >> http://cmoulliard.blogspot.com/ > >> -- > >> View this message in context: > >> > http://www.nabble.com/1-OSGi-service-dependencies%2C-1-unsatisfied-%28for-beans---activemqservice-%29-in-OsgiBundleXmlApplicationContext-tp22537014p22541181.html > >> Sent from the ServiceMix - User mailing list archive at Nabble.com. > >> > >> > > > > > > -- > > Cheers, > > Guillaume Nodet > > ------------------------ > > Blog: http://gnodet.blogspot.com/ > > ------------------------ > > Open Source SOA > > http://fusesource.com > > > > > > > ----- > Charles Moulliard > SOA Architect > > My Blog : http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/ > -- > View this message in context: > http://www.nabble.com/1-OSGi-service-dependencies%2C-1-unsatisfied-%28for-beans---activemqservice-%29-in-OsgiBundleXmlApplicationContext-tp22537014p22554683.html > Sent from the ServiceMix - User mailing list archive at Nabble.com. > > -- Cheers, Guillaume Nodet ------------------------ Blog: http://gnodet.blogspot.com/ ------------------------ Open Source SOA http://fusesource.com
