0 Replies Latest reply on Aug 25, 2009 6:18 AM by vinoth kumar

    Getting Classcast Exception Inconsistently on WSAddressing I

    vinoth kumar Newbie

      Hello all,

      We are using JBOSS 4.2.3 with JBOSSWS Native 3.1.0 deployed.

      We had implemented WSAddressing for Our Services as per the Steps given in the link : http://www.jboss.org/community/wiki/JBossWS-NativeUserGuide.

      This WSAddressing implementation works fine without any issues if we give a single hit to the Services from the client for a given time. But if we have multiple simultaneous hits, we are getting the Classcast Exception inconsistently.

      We had done the following changes in Client,

      Service service = Service.create(wsdlURL, serviceName);
       port1 = (IdentityServiceImpl)service.getPort(IdentityServiceImpl.class);
       BindingProvider bindingProvider = (BindingProvider)port1;
      
       List<Handler> customHandlerChain = new ArrayList<Handler>();
       customHandlerChain.add(new ClientHandler());
       customHandlerChain.add(new WSAddressingClientHandler());
       bindingProvider.getBinding().setHandlerChain(customHandlerChain);



      The Exception that we are getting is,

      javax.xml.ws.WebServiceException: java.lang.ClassCastException: com.mobax.signage.ws.RemoveDeviceResponse cannot be cast to com.mobax.signage.ws.GetDeviceResponseResponse
      at org.jboss.ws.core.jaxws.client.ClientImpl.handleRemoteException(ClientImpl.java:404)
      at org.jboss.ws.core.jaxws.client.ClientImpl.invoke(ClientImpl.java:314)
      at org.jboss.ws.core.jaxws.client.ClientProxy.invoke(ClientProxy.java:172)
      at org.jboss.ws.core.jaxws.client.ClientProxy.invoke(ClientProxy.java:152)
      at $Proxy103.removeDevice(Unknown Source)
      at com.mobax.mashup.webserviceconsumer.SignageServiceConsumer.removeDevices(SignageServiceConsumer.java:264)
      at com.mobax.mashup.responsebuilder.EnablerResponseParser.removeDevice(EnablerResponseParser.java:1489)
      at com.mobax.mashup.servlet.signage.RemoveDevice.processRequest(RemoveDevice.java:60)
      at com.mobax.mashup.servlet.signage.RemoveDevice.doGet(RemoveDevice.java:88)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
      at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
      at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
      at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
      at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
      at java.lang.Thread.run(Thread.java:619)



      As per Our understanding,

      We are invoking the method port1.getDeviceResponse(). Before receiving the response for this request, we are invoking another method port1.removeDevice(). The Proxy seems to be waiting for the Response for the second request removeDevice(). When it receives the Response for the first request getDeviceResponse(), the proxy tries to parse this response assuming that this response belongs to the Second request, thus Resulting in Classcast Exception.


      We would like to know whether anybody have Successfully implemented the WSAddressing in their Services without having any issues.

      Interestingly, we had find out a WORKAROUND for this issue. The workaround is to generate the following code for every Request. i.e., before calling any Requests, if we generate the following proxy every time newly, then the Exception does not Occurs.
       port1 = (IdentityServiceImpl)service.getPort(IdentityServiceImpl.class);
       BindingProvider bindingProvider = (BindingProvider)port1;
      
       List<Handler> customHandlerChain = new ArrayList<Handler>();
       customHandlerChain.add(new ClientHandler());
       customHandlerChain.add(new WSAddressingClientHandler());
       bindingProvider.getBinding().setHandlerChain(customHandlerChain);



      Does anybody have any idea on this? We are not getting enough responses on our previous posts for this issue. So I had opened a new thread and provided more information on this issue.

      Thanks for reading this long post.


      Regards,
      Vinoth Kumar