5 Replies Latest reply: Aug 20, 2012 12:35 PM by Łukasz Dywicki RSS

    JBoss modules and CDI extension

    Łukasz Dywicki Novice

      Hi all,

      During my work on switchyard I've found issue with loading of CDI extension. I have three modules switchyard-component-camel -> camel-cdi -> deltaspike-core-api. The classloading works - switchyard component is started, camel-cdi sees deltaspike and deltaspike sees JSR classes. The problem is deltaspike javax.enterprise.inject.spi.Extension is not picked up and later deltaspike throws exception. I am not sure if it is configuration issue. The modules definition:

       

       

      <module xmlns="urn:jboss:module:1.0" name="org.apache.deltaspike.core-api">
      
          <resources>
              <resource-root path="deltaspike-core-api-${version.deltaspike}.jar"/>
          </resources>
      
          <dependencies>
              <module name="javax.api" />
              <module name="javax.el.api" />
              <module name="javax.enterprise.api"/>
              <module name="javax.inject.api"/>
              <module name="javax.interceptor.api"/>
          </dependencies>
      
      </module>
      

       

       

      <module xmlns="urn:jboss:module:1.0" name="org.apache.camel.cdi">
      
          <resources>
              <resource-root path="camel-cdi-${version.camel}.jar"/>
          </resources>
      
          <dependencies>
              <module name="org.slf4j"/>
              <module name="org.apache.deltaspike.core-api" services="export" export="true" />
              <module name="org.apache.camel.core"/>
          </dependencies>
      
      </module>
      

       

       

      <module xmlns="urn:jboss:module:1.0" name="org.switchyard.component.camel">
      
          <resources>
              <resource-root path="switchyard-component-camel-${project.version}.jar"/>
          </resources>
      
          <dependencies>
              <module name="javax.api"/>
              <module name="javax.enterprise.api"/>
              <module name="javax.ws.rs.api"/>
              <module name="org.apache.log4j"/>
              <module name="org.apache.camel.core" services="export" export="true"/>
              <module name="org.apache.camel.cdi" services="export" export="true" />
              <module name="org.apache.camel.spring" services="export" export="true">
              <!-- and so on... -->
      
          </dependencies>
      </module>
      
        • 1. Re: JBoss modules and CDI extension
          Łukasz Dywicki Novice

          I was unable to get correct module definitions with help from IRC so I put instructions how to reproduce issue.

           

          git clone https://github.com/splatch/parent.git
          cd parent
          git checkout SWITCHYARD-981
          mvn clean install
          git clone https://github.com/splatch/components.git components
          cd components
          git checkout SWITCHYARD-981
          mvn clean install
          git clone https://github.com/splatch/release.git
          cd release
          git checkout SWITCHYARD-981
          mvn clean install
          

           

          During build of release you'll find a integration tests, and if problem occurs following stack trace:

           

          14:38:01,798 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-13) MSC00001: Failed to start service jboss.deployment.unit."switchyard-quickstart-rules-camel-cbr-0.6.0-SNAPSHOT.jar".SwitchYardService: org.jboss.msc.service.StartException in service jboss.deployment.unit."switchyard-quickstart-rules-camel-cbr-0.6.0-SNAPSHOT.jar".SwitchYardService: org.switchyard.exception.SwitchYardException: Failed to create route route1: Route[[From[switchyard://RoutingService?namespace=urn%3Aswit... because of Cannot lookup: properties from registry: CdiRegistry[1539734637] with expected type: interface org.apache.camel.Component due: No org.apache.deltaspike.core.api.provider.BeanManagerProvider in place! Please ensure that you configured the CDI implementation of your choice properly. If your setup is correct, please clear all caches and compiled artifacts.
                    at org.switchyard.as7.extension.services.SwitchYardService.start(SwitchYardService.java:79)
                    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
                    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
                    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [classes.jar:1.6.0_33]
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [classes.jar:1.6.0_33]
                    at java.lang.Thread.run(Thread.java:680) [classes.jar:1.6.0_33]
          Caused by: org.switchyard.exception.SwitchYardException: Failed to create route route1: Route[[From[switchyard://RoutingService?namespace=urn%3Aswit... because of Cannot lookup: properties from registry: CdiRegistry[1539734637] with expected type: interface org.apache.camel.Component due: No org.apache.deltaspike.core.api.provider.BeanManagerProvider in place! Please ensure that you configured the CDI implementation of your choice properly. If your setup is correct, please clear all caches and compiled artifacts.
                    at org.switchyard.component.camel.deploy.CamelActivator.handleImplementation(CamelActivator.java:253)
                    at org.switchyard.component.camel.deploy.CamelActivator.activateService(CamelActivator.java:140)
                    at org.switchyard.deploy.internal.Deployment.deployImplementations(Deployment.java:390)
                    at org.switchyard.deploy.internal.Deployment.start(Deployment.java:140)
                    at org.switchyard.as7.extension.deployment.SwitchYardDeployment.start(SwitchYardDeployment.java:103)
                    at org.switchyard.as7.extension.services.SwitchYardService.start(SwitchYardService.java:72)
                    ... 5 more
          Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route route1: Route[[From[switchyard://RoutingService?namespace=urn%3Aswit... because of Cannot lookup: properties from registry: CdiRegistry[1539734637] with expected type: interface org.apache.camel.Component due: No org.apache.deltaspike.core.api.provider.BeanManagerProvider in place! Please ensure that you configured the CDI implementation of your choice properly. If your setup is correct, please clear all caches and compiled artifacts.
                    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:176)
                    at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:712)
                    at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:1749)
                    at org.apache.camel.impl.DefaultCamelContext.addRouteDefinitions(DefaultCamelContext.java:656)
                    at org.apache.camel.impl.DefaultCamelContext.addRouteDefinition(DefaultCamelContext.java:661)
                    at org.switchyard.component.camel.deploy.CamelActivator.handleImplementation(CamelActivator.java:247)
                    ... 10 more
          Caused by: org.apache.camel.NoSuchBeanException: Cannot lookup: properties from registry: CdiRegistry[1539734637] with expected type: interface org.apache.camel.Component due: No org.apache.deltaspike.core.api.provider.BeanManagerProvider in place! Please ensure that you configured the CDI implementation of your choice properly. If your setup is correct, please clear all caches and compiled artifacts.
                    at org.apache.camel.impl.CompositeRegistry.lookup(CompositeRegistry.java:58)
                    at org.apache.camel.impl.PropertyPlaceholderDelegateRegistry.lookup(PropertyPlaceholderDelegateRegistry.java:62)
                    at org.apache.camel.impl.DefaultCamelContext.getPropertiesComponent(DefaultCamelContext.java:2180)
                    at org.apache.camel.impl.DefaultCamelContext.resolvePropertyPlaceholders(DefaultCamelContext.java:1010)
                    at org.apache.camel.util.CamelContextHelper.parseBoolean(CamelContextHelper.java:325)
                    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:832)
                    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:171)
                    ... 15 more
          Caused by: java.lang.IllegalStateException: No org.apache.deltaspike.core.api.provider.BeanManagerProvider in place! Please ensure that you configured the CDI implementation of your choice properly. If your setup is correct, please clear all caches and compiled artifacts.
                    at org.apache.deltaspike.core.api.provider.BeanManagerProvider.getInstance(BeanManagerProvider.java:90)
                    at org.apache.deltaspike.core.api.provider.BeanProvider.getBeanManager(BeanProvider.java:379)
                    at org.apache.deltaspike.core.api.provider.BeanProvider.getContextualReference(BeanProvider.java:166)
                    at org.apache.camel.component.cdi.CdiBeanRegistry.lookup(CdiBeanRegistry.java:51)
                    at org.apache.camel.impl.CompositeRegistry.lookup(CompositeRegistry.java:49)
                    ... 21 more
          

           

          Module definitions are located inside release project under

          jboss-as7/modules/src/main/resources/external/apache/deltaspike/core-api

          jboss-as7/modules/src/main/resources/external/camel/cdi

          jboss-as7/modules/src/main/resources/switchyard/components/camel/resources

           

          As sugessted I've tried also to modify weld-core module definition which is located under jboss-as7/modules/src/main/resources/external/weld-core

           

          Best regards,

          Lukasz

          • 2. Re: JBoss modules and CDI extension
            Jozef Hartinger Master

            I think it's not currently possible to have a CDI extension in a module that is not part of the deployment. Nevertheless, it should be possible to implement a deployer that registers the extension such as https://github.com/jbossas/jboss-as/blob/master/jaxrs/src/main/java/org/jboss/as/jaxrs/deployment/JaxrsCdiIntegrationProcessor.java#L106

            • 3. Re: JBoss modules and CDI extension
              Łukasz Dywicki Novice

              Hey Jozef,

              Thanks for tip, will try implement that as we already have custom deployers in switchyard.

              • 5. Re: JBoss modules and CDI extension
                Łukasz Dywicki Novice

                Thanks all of you for hints. The deployment processor helped me to get CDI extension loaded during start up.

                 

                However deltaspike is still unable to work properly because BeanManagerProvider bind BeanManager instance to classloader. Because of that for classes who load this class from other dependency path it doesn't work.

                 

                For example my deployment unit is called "soap-proxy" and it is not CDI deployment unit (no beans.xml) - because I have two different classloaders it causes problems. BeanManager instance is bound to switchyard component class loader but it is not bound to deltaspike module classloader used later by deployment unit.

                More over the switchyard component class loader is shared between different deployment units and if I load cdi aware deployment unit first it breaks second - non aware.