7 Replies Latest reply on Oct 7, 2011 11:35 AM by paul.robinson

    Module Dependency for supporting external Handler

    paul.robinson

      Hello,

       

      I'm trying to configure module dependencies for a JAX-WS Web service. The complication seems to come from the fact that the service uses a Handler that lives inside a dependency rather than the same deployment archive as the Web service. The problem is appearing in the TXBridge and XTS demos in the JBossTS project. I would ask someone on the Transactions team to fix this, but unfortunately that is me ;-)

       

      In more detail this is what we have:

       

      The application (txbridge-demo-service.jar) that I am deploying depends on org.jboss.xts, which is where the handler that is specified in the handler chain lives. The Web service only uses JAX-WS annotations (rather than CXF) so I have the following dependencies specified in the manifest.mf of the txbridge-demo-service.jar:

       

      Dependencies: javax.xml.ws.api, org.jboss.xts, org.jboss.ws.cxf.jbossws-cxf-client services export
      

       

      The module "org.jboss.xts" has the following module.xml, which includes dependencies to JBossWS:

       

      <module xmlns="urn:jboss:module:1.0" name="org.jboss.xts">
      
          <resources>
              <resource-root path="jbossxts-4.15.3.Final.jar"/>
              <resource-root path="jbossxts-api-4.15.3.Final.jar"/>
              <resource-root path="jbosstxbridge-4.15.3.Final.jar"/>
              <!-- Insert resources here -->
          </resources>
      
          <dependencies>
              <module name="javax.transaction.api"/>
              <module name="javax.resource.api" />
              <module name="system"/>
              <module name="org.jboss.jts"/>
              <module name="org.jboss.ws.api" services="export"/>
              <module name="org.jboss.ws.jaxws-client" services="export"/>
              <module name="org.jboss.ws.cxf.jbossws-cxf-client" services="export"/>
              <module name="org.jboss.logging"/>
              <module name="javax.xml.soap.api"/>
              <module name="javax.xml.ws.api"/>
              <module name="javax.xml.stream.api"/>
              <!-- this is needed to get javax.xml.namespace.QName but it would be better if it were exposed on its own -->
              <module name="javax.api"/>
              <!-- this is needed because our endpoints are not in a normal deployment and we need to be able
                  to resolve the javax.jws.WebService annotation attached to them. presumably an endpoint
                  found in a deployment gets this package auto-added to its module loader
                  -->
              <module name="javax.jws.api"/>
              <!-- this is needed to ensure @Resource annotations on the JaxWS endpoint classes are in the
                   classloader scope-->
              <module name="javax.annotation.api"/>
              <!-- this is needed to ensure the JaxWS endpoint classes canb refer to HttpServletRequest etc -->
              <module name="javax.servlet.api"/>
          </dependencies>
      </module>
      

       

      When I deploy my application I get the following stack trace:

       

      10:14:55,883 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."txbridge-demo-service.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."txbridge-demo-service.jar".INSTALL: Failed to process phase INSTALL of deployment "txbridge-demo-service.jar"
          at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:121) [jboss-as-server-7.1.0.Alpha2-SNAPSHOT.jar:7.1.0.Alpha2-SNAPSHOT]
          at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
          at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [:1.6.0_22]
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [:1.6.0_22]
          at java.lang.Thread.run(Thread.java:679) [:1.6.0_22]
      Caused by: javax.xml.ws.WebServiceException: javax.xml.ws.WebServiceException: Failed to instantiate handler
          at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:350)
          at org.jboss.wsf.stack.cxf.deployment.EndpointImpl.doPublish(EndpointImpl.java:88)
          at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:239)
          at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:509)
          at org.jboss.wsf.stack.cxf.configuration.NonSpringBusHolder.configure(NonSpringBusHolder.java:116)
          at org.jboss.wsf.stack.cxf.deployment.aspect.BusDeploymentAspect.startDeploymentBus(BusDeploymentAspect.java:109)
          at org.jboss.wsf.stack.cxf.deployment.aspect.BusDeploymentAspect.start(BusDeploymentAspect.java:132)
          at org.jboss.as.webservices.deployers.AspectDeploymentProcessor.internalDeploy(AspectDeploymentProcessor.java:79)
          at org.jboss.as.webservices.deployers.TCCLDeploymentProcessor.deploy(TCCLDeploymentProcessor.java:42)
          at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:115) [jboss-as-server-7.1.0.Alpha2-SNAPSHOT.jar:7.1.0.Alpha2-SNAPSHOT]
          ... 5 more
      Caused by: javax.xml.ws.WebServiceException: Failed to instantiate handler
          at org.apache.cxf.jaxws.handler.HandlerChainBuilder.buildHandlerChain(HandlerChainBuilder.java:131)
          at org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder.processHandlerElement(AnnotationHandlerChainBuilder.java:267)
          at org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder.processHandlerChainElement(AnnotationHandlerChainBuilder.java:167)
          at org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder.buildHandlerChainFromClass(AnnotationHandlerChainBuilder.java:120)
          at org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder.buildHandlerChainFromClass(AnnotationHandlerChainBuilder.java:284)
          at org.apache.cxf.jaxws.JaxWsServerFactoryBean.buildHandlerChain(JaxWsServerFactoryBean.java:237)
          at org.apache.cxf.jaxws.JaxWsServerFactoryBean.initializeResourcesAndHandlerChain(JaxWsServerFactoryBean.java:216)
          at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:203)
          at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:433)
          at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:322)
          ... 14 more
      Caused by: java.lang.ClassCastException: class org.jboss.jbossts.txbridge.inbound.JaxWSTxInboundBridgeHandler
          at java.lang.Class.asSubclass(Class.java:3039) [:1.6.0_22]
          at org.apache.cxf.jaxws.handler.HandlerChainBuilder.buildHandlerChain(HandlerChainBuilder.java:121)
          ... 23 more
      

       

      The ClassCastException refers to org.jboss.jbossts.txbridge.inbound.JaxWSTxInboundBridgeHandler which is the handler that lives in the org.jboss.xts module. I think the problem is that when JBossWS creates the endpoint it does not have JaxWSTxInboundBridgeHandler in it's Classloader as JBossWS does not depend on org.jboss.xts (which of course it shouldn't as org.jboss.xts depends on JBossWS). However, the application does depend on org.jboss.xts, which I don't think is of any help to JBossWS.

       

      Is my reasoning about what is wrong correct and can anyone suggest how I can fix this?

       

      Many thanks,

       

      Paul Robinson.

        • 1. Re: Module Dependency for supporting external Handler
          paul.robinson

          Hello,

           

          I've spoken to Andrew Dinn and he says that the XTS demo used to work on JBoss 7, when he ported it on the 20 Jul 2011 (according to svn). I'm seeing the same error with the XTS demo as above (but with a different Handler class, which is what I would expect).

           

          Do you know if anything has changed around the module dependencies or the way dependencies are managed tht might be causing this?

           

          Thanks,

           

          Paul.

          • 2. Re: Module Dependency for supporting external Handler
            asoldano

            It's hard to tell exactly what might have been changed that is causing this. Do you have any continuous integration testing showing when the regression has been introduced exactly?

            In any case, AFAICS the ClassCastException there comes from a failure in calling Class::asSubclass(Handler.class) on your handler class. Can you try debugging a bit and checking which classloaders are involved there? I assume your handler is properly implementing javax.xml.ws.handler.Handler, so there's likely something weird with the classloader(s) that loaded your handler and Handler, right?

            1 of 1 people found this helpful
            • 3. Re: Module Dependency for supporting external Handler
              paul.robinson

              Alessio,

               

              Thanks for taking a look.

               

              Unfortunately we don't have a CI test for these demos. This is something that I want to see addressed soon.

               

              At the point at which the ClassCastException is occuring, The Classloader being used is:

               

              ModuleClassLoader for Module "deployment.txbridge-demo-service.jar:main" from Service Module Loader
              

               

              Which is the one that I would expect to be used. The module has dependencies for "javax.xml.ws.handler.Handler" from "javax.xml.ws.api" and "org.jboss.jbossts.txbridge.inbound.JaxWSTxInboundBridgeHandler" from "org.jboss.xts". Which I think is enough to create the Handler. I'll debug the point at which the ModuleClassLoader is created and see if I can discover which dependencies are being pulled in.

               

              Do you know if I have correctly defined the Dependencies section of the MANIFEST.mf in order for the ClassLoader to be able to load the JaxWSTxInboundBridgeHandler and Handler classes? For example, do I need to export the org.jboss.xts and the javax.xml.ws.api dependencies?

               

               

              Thanks,

               

              Paul.

              • 4. Re: Module Dependency for supporting external Handler
                asoldano

                 

                At the point at which the ClassCastException is occuring, The Classloader being used is:

                 

                ModuleClassLoader for Module "deployment.txbridge-demo-service.jar:main" from Service Module Loader
                

                 

                Which is the one that I would expect to be used. The module has dependencies for "javax.xml.ws.handler.Handler" from "javax.xml.ws.api" and "org.jboss.jbossts.txbridge.inbound.JaxWSTxInboundBridgeHandler" from "org.jboss.xts". Which I think is enough to create the Handler. I'll debug the point at which the ModuleClassLoader is created and see if I can discover which dependencies are being pulled in.

                ok, let me know if you find out something interesting

                 

                 

                Do you know if I have correctly defined the Dependencies section of the MANIFEST.mf in order for the ClassLoader to be able to load the JaxWSTxInboundBridgeHandler and Handler classes? For example, do I need to export the org.jboss.xts and the javax.xml.ws.api dependencies?


                AFAIK the dependencies you specified should be fine (no need for the export flag)

                • 5. Re: Module Dependency for supporting external Handler
                  paul.robinson

                  The answer seems to be, to remove:

                   

                  <module name="system"/>
                  

                   

                  From the org.jboss.xts dependencies.

                   

                  Of course, I now need to find out why XTS depends on "system" and whether it is safe to remove. This application did used to work on an older version of AS 7, so I'm guessing that either the classes that make up the system dependency has changed, or the way JBoss Modules deals with System has changed.

                   

                  Thanks for all the assistance!

                   

                  Paul.

                  • 6. Re: Module Dependency for supporting external Handler
                    asoldano

                    Ah, right, depending on the system module is explicitely said to be an error, see http://community.jboss.org/wiki/HackingOnAS7, Appendix A.8. My guess is that that was basically having you consume some classes from the JDK directly, hence with different classloaders being involved.

                    1 of 1 people found this helpful
                    • 7. Re: Module Dependency for supporting external Handler
                      paul.robinson

                      Alessio,

                       

                      Thanks for the link. Good to see it confirmed that i can remove the dependency on System. It also confirms my suspicions on why I was getting that error.

                       

                      Paul.