[ https://issues.apache.org/jira/browse/CAMEL-4537?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13126937#comment-13126937 ]
Aaron Whiteside commented on CAMEL-4537: ---------------------------------------- OK, So here is my real problems with Camel, maybe you have a solution... * Camel JMS Component depends on Spring. * Camel Blueprint support depends on the Aries implementation. * Camel Spring+OSGi support only works with Spring DM 1.2 not Spring DM 2.0. So while I can manually create an OSGiCamelContext instance in a non-Aries-Blueprint-implementation, I have no way of configuring the JMS Component's ConnectionFactory or TransactionManager. As the JMS Component uses the spring's ApplicationContext to look them up. If I manually can create the JMSComponent in the Blueprint context and register it as a service but the CamelContext cannot see that instance. This is my blueprint context and keep in mind this is running on JBoss 7.0.2 using it's own Blueprint implementation. {code:language=xml} <?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- Setup Spring's JTA Transaction Manager --> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:jboss/TransactionManager"/> </bean> <!-- Use JNDI --> <bean id="initialContext" class="javax.naming.InitialContext"/> <!-- Lookup the JMS connection factory from the container --> <bean id="connectionFactory" factory-ref="initialContext" factory-method="lookup"> <argument value="java:/JmsXA"/> </bean> <!-- Create and Register JmsComponent --> <bean id="jmsComponent" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory" ref="connectionFactory"/> <property name="transactionManager" ref="transactionManager"/> </bean> <service ref="jmsComponent" interface="org.apache.camel.Component"/> <!-- Setup a Camel Context instance --> <bean id="camelContext" class="org.apache.camel.core.osgi.OsgiDefaultCamelContext" init-method="start" destroy-method="stop" scope="singleton"> <argument ref="blueprintBundleContext"/> </bean> </blueprint> {code} With Spring DM 2.0 or Gemini this is much easier to do, the only problem being that Camel will not detect it's in an OSGi environment and will not find the various component bundles. So it cannot even find the JMSComponent. This is a copy of the Spring DM 2.0 context I was using: {code:language=xml} <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- Setup Spring's JTA Transaction Manager --> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:jboss/TransactionManager"/> </bean> <!-- Lookup the JMS connection factory from the container --> <jee:jndi-lookup id="connectionFactory" jndi-name="java:/JmsXA" lookup-on-startup="true" expected-type="javax.jms.ConnectionFactory"/> <!-- Create and Register JmsComponent --> <!--<bean id="jmsComponent" class="org.apache.camel.component.jms.JmsComponent">--> <!--<property name="connectionFactory" ref="connectionFactory"/>--> <!--<property name="transactionManager" ref="transactionManager"/>--> <!--</bean>--> <!--<osgi:service ref="jmsComponent" interface="org.apache.camel.Component"/>--> <!-- Setup a Camel Context instance --> <camel:camelContext id="camelContext" autoStartup="true" shutdownRunningTask="CompleteAllTasks"> <camel:jmxAgent id="jmxAgent" disabled="false" usePlatformMBeanServer="true" createConnector="false"/> </camel:camelContext> </beans> {code} So how to use JMS in OSGi without using Spring or Aries for Blueprint? > Support for Spring DM 2.0 > ------------------------- > > Key: CAMEL-4537 > URL: https://issues.apache.org/jira/browse/CAMEL-4537 > Project: Camel > Issue Type: Bug > Components: osgi > Affects Versions: 2.9.0 > Environment: JBoss 7.0.2 - OSGi > Reporter: Aaron Whiteside > Assignee: Jean-Baptiste Onofré > Priority: Critical > Labels: OSGi, Spring > > The camel-spring-2.9-SNAPSHOT.jar bundle imports > org.springframework.osgi.context;version="[1.2,2)";resolution:=optional, > Which obviously excludes Spring DM 2.0.0M1 > I am not sure if Spring DM 2.0 breaks anything Camel is trying to use, but > the class org.springframework.osgi.context.BundleContextAware it is searching > for on startup does exist in spring-osgi-core-2.0.0.M1.jar. > Currently when I deploy Camel 2.9-SNAPSHOT in JBoss 7.0.2 with Spring DM > 2.0.0M1 I get the following error, and I am unable to resolve any Components > from the OSGi Service registry - obviously because Camel is not trying to use > it. > {code} > 18:04:32,347 WARN [org.jboss.modules] (SpringOsgiExtenderThread-1) Failed to > define class org.apache.camel.osgi.CamelContextFactoryBean in Module > "deployment.org.apache.camel.camel-spring:2.9.0.SNAPSHOT" from Service Module > Loader: java.lang.LinkageError: Failed to link > org/apache/camel/osgi/CamelContextFactoryBean (Module > "deployment.org.apache.camel.camel-spring:2.9.0.SNAPSHOT" from Service Module > Loader) > at > org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:401) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:261) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:76) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.FilteredLocalLoader.loadClassLocal(FilteredLocalLoader.java:46) > [jboss-modules.jar:1.0.2.GA] > at org.jboss.modules.Module.loadModuleClass(Module.java:590) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:183) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:361) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:310) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:103) > [jboss-modules.jar:1.0.2.GA] > at java.lang.Class.forName0(Native Method) [:1.7.0] > at java.lang.Class.forName(Class.java:186) [:1.7.0] > at > org.apache.camel.spring.handler.CamelNamespaceHandler.init(CamelNamespaceHandler.java:133) > at > org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(DefaultNamespaceHandlerResolver.java:130) > at > org.springframework.osgi.extender.internal.support.NamespacePlugins$Plugin.resolve(NamespacePlugins.java:78) > at > org.springframework.osgi.extender.internal.support.NamespacePlugins$5.operate(NamespacePlugins.java:210) > at > org.springframework.osgi.extender.internal.support.NamespacePlugins$5.operate(NamespacePlugins.java:206) > at > org.springframework.osgi.extender.internal.support.LazyBundleRegistry.apply(LazyBundleRegistry.java:161) > at > org.springframework.osgi.extender.internal.support.NamespacePlugins.doResolve(NamespacePlugins.java:206) > at > org.springframework.osgi.extender.internal.support.NamespacePlugins.resolve(NamespacePlugins.java:170) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.7.0] > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > [:1.7.0] > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > [:1.7.0] > at java.lang.reflect.Method.invoke(Method.java:601) [:1.7.0] > at > org.springframework.osgi.context.support.TrackingUtil$OsgiServiceHandler.invoke(TrackingUtil.java:108) > at $Proxy12.resolve(Unknown Source) at > org.springframework.osgi.context.support.DelegatedNamespaceHandlerResolver.resolve(DelegatedNamespaceHandlerResolver.java:57) > at > org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1333) > at > org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1328) > at > org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135) > at > org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93) > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) > at > org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143) > at > org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178) > at > org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) > at > org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:172) > at > org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:142) > at > org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) > at > org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467) > at > org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$800(AbstractDelegatedExecutionApplicationContext.java:62) > at > org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:244) > at > org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:87) > at > org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:222) > at > org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:225) > at > org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:178) > at > org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:159) > at > org.springframework.osgi.extender.internal.activator.LifecycleManager$1.run(LifecycleManager.java:223) > at java.lang.Thread.run(Thread.java:722) [:1.7.0] > Caused by: java.lang.NoClassDefFoundError: > org/springframework/osgi/context/BundleContextAware > at java.lang.ClassLoader.defineClass1(Native Method) [:1.7.0] > at java.lang.ClassLoader.defineClass(ClassLoader.java:791) [:1.7.0] > at > java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) > [:1.7.0] > at > org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:397) > [jboss-modules.jar:1.0.2.GA] > ... 50 more > Caused by: java.lang.ClassNotFoundException: > org.springframework.osgi.context.BundleContextAware from [Module > "deployment.org.apache.camel.camel-spring:2.9.0.SNAPSHOT" from Service Module > Loader] > at > org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:361) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:310) > [jboss-modules.jar:1.0.2.GA] > at > org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:103) > [jboss-modules.jar:1.0.2.GA] > ... 54 more > 18:04:32,368 INFO [org.apache.camel.spring.handler.CamelNamespaceHandler] > (SpringOsgiExtenderThread-1) OSGi environment not detected. > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira