1 Reply Latest reply on Dec 19, 2007 5:49 PM by Alejandro Guizar

    BPEL Problem: Fault Handler

    Agustín Gañan Newbie

      Hi, I'm trying to develop a BPEL process with fault handling. I have a DNS web service wich send a fault message when cannot resolve an URL. The wsdl from this service is this:

      <?xml version="1.0" encoding="UTF-8"?>
      <wsdl:definitions targetNamespace="http://dns"
      xmlns:apachesoap="http://xml.apache.org/xml-soap"
      xmlns:impl="http://dns" xmlns:intf="http://dns"
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
      xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <!--WSDL created by Apache Axis version: 1.3
      Built on Oct 05, 2005 (05:23:37 EDT)-->
       <wsdl:types>
       <schema elementFormDefault="qualified"
      targetNamespace="http://dns" xmlns="http://www.w3.org/2001/XMLSchema">
       <element name="getIPByURL">
       <complexType>
       <sequence>
       <element name="request" type="impl:DNSRequestData"/>
       </sequence>
       </complexType>
       </element>
       <complexType name="DNSRequestData">
       <sequence>
       <element name="URL" nillable="true" type="xsd:string"/>
       </sequence>
       </complexType>
       <element name="getIPByURLResponse">
       <complexType>
       <sequence>
       <element name="getIPByURLReturn" type="impl:DNSResponseData"/>
       </sequence>
       </complexType>
       </element>
       <complexType name="DNSResponseData">
       <sequence>
       <element name="IP" nillable="true" type="xsd:string"/>
       </sequence>
       </complexType>
       <complexType name="DNSFault">
       <sequence>
       <element name="MESSAGE" nillable="true" type="xsd:string"/>
       </sequence>
       </complexType>
       <element name="fault" type="impl:DNSFault"/>
       </schema>
       </wsdl:types>
      
       <wsdl:message name="getIPByURLRequest">
      
       <wsdl:part element="impl:getIPByURL" name="parameters"/>
      
       </wsdl:message>
      
       <wsdl:message name="DNSFault">
      
       <wsdl:part element="impl:fault" name="fault"/>
      
       </wsdl:message>
      
       <wsdl:message name="getIPByURLResponse">
      
       <wsdl:part element="impl:getIPByURLResponse" name="parameters"/>
      
       </wsdl:message>
      
       <wsdl:portType name="DNS">
      
       <wsdl:operation name="getIPByURL">
      
       <wsdl:input message="impl:getIPByURLRequest" name="getIPByURLRequest"/>
      
       <wsdl:output message="impl:getIPByURLResponse" name="getIPByURLResponse"/>
      
       <wsdl:fault message="impl:DNSFault" name="DNSFault"/>
      
       </wsdl:operation>
      
       </wsdl:portType>
      
       <wsdl:binding name="DNSSoapBinding" type="impl:DNS">
      
       <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      
       <wsdl:operation name="getIPByURL">
      
       <wsdlsoap:operation soapAction=""/>
      
       <wsdl:input name="getIPByURLRequest">
      
       <wsdlsoap:body use="literal"/>
      
       </wsdl:input>
      
       <wsdl:output name="getIPByURLResponse">
      
       <wsdlsoap:body use="literal"/>
      
       </wsdl:output>
      
       <wsdl:fault name="DNSFault">
      
       <wsdlsoap:fault name="DNSFault" use="literal"/>
      
       </wsdl:fault>
      
       </wsdl:operation>
      
       </wsdl:binding>
      
       <wsdl:service name="DNSService">
      
       <wsdl:port binding="impl:DNSSoapBinding" name="DNS">
      
       <wsdlsoap:address location="http://localhost:4040/DNSWebService/services/DNS"/>
      
       </wsdl:port>
      
       </wsdl:service>
      
      </wsdl:definitions>
      
      

      In the BPEL code I have this:
      <bpws:faultHandlers>
       <bpws:catch faultName="ns1:DNSFault">
       <bpws:sequence name="HiddenSequence">
       <bpws:assign name="LoadErrorMessage" validate="no">
       <bpws:copy>
       <bpws:from>'Error in Service'</bpws:from>
       <bpws:to>$output.outputparam/tns:City</bpws:to>
       </bpws:copy>
       <bpws:copy>
       <bpws:from>'Error in Service'</bpws:from>
       <bpws:to>$output.outputparam/tns:Country</bpws:to>
       </bpws:copy>
       </bpws:assign>
       <bpws:reply name="SendErrorMessage" operation="getURLInfo" partnerLink="client" portType="tns:BPELService" variable="output"/>
       </bpws:sequence>
       </bpws:catch>
       </bpws:faultHandlers>

      The proces is deployed and works well when there is no fault, but when the DNS service send a fault message, I got this:
      2007-11-07 12:14:18,234 DEBUG [org.jbpm.bpel.integration.jms.StartListener] caught exception while passing control to process, searching for handler
      org.jbpm.bpel.BpelException: no wsdl fault matches the contents of the soap detail element: org.jboss.ws.soap.DetailImpl@17a35c[[detail: null]]
      at org.jbpm.bpel.integration.client.SoapClient.readFault(SoapClient.java:497)
      at org.jbpm.bpel.integration.client.SoapClient.call(SoapClient.java:115)
      at org.jbpm.bpel.integration.jms.JmsIntegrationService.invoke(JmsIntegrationService.java:242)
      at org.jbpm.bpel.graph.basic.Invoke.execute(Invoke.java:46)
      at org.jbpm.bpel.graph.def.Activity.enter(Activity.java:105)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.bpel.graph.def.Activity.leave(Activity.java:184)
      at org.jbpm.bpel.graph.basic.Assign.execute(Assign.java:55)
      at org.jbpm.bpel.graph.def.Activity.enter(Activity.java:105)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.bpel.graph.def.Activity.leave(Activity.java:184)
      at org.jbpm.bpel.graph.struct.ProcessInstanceStarter.visit(ProcessInstanceStarter.java:66)
      at org.jbpm.bpel.graph.basic.Receive.accept(Receive.java:81)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:185)
      at org.jbpm.bpel.graph.basic.Receive$$EnhancerByCGLIB$$9222be5b.accept(<generated>)
      at org.jbpm.bpel.graph.struct.ProcessInstanceStarter.visit(ProcessInstanceStarter.java:100)
      at org.jbpm.bpel.graph.struct.Sequence.accept(Sequence.java:104)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:185)
      at org.jbpm.bpel.graph.def.Activity$$EnhancerByCGLIB$$9e9c8226.accept(<generated>)
      at org.jbpm.bpel.graph.struct.ProcessInstanceStarter.visit(ProcessInstanceStarter.java:54)
      at org.jbpm.bpel.graph.def.BpelDefinition.messageReceived(BpelDefinition.java:111)
      at org.jbpm.bpel.integration.jms.StartListener.onMessage(StartListener.java:124)
      at org.jboss.mq.SpyMessageConsumer.run(SpyMessageConsumer.java:696)
      at java.lang.Thread.run(Thread.java:595)
      2007-11-07 12:14:18,234 ERROR [org.jbpm.bpel.integration.jms.StartListener] could not start process instance
      org.jbpm.bpel.BpelException: no wsdl fault matches the contents of the soap detail element: org.jboss.ws.soap.DetailImpl@17a35c[[detail: null]]
      at org.jbpm.bpel.integration.client.SoapClient.readFault(SoapClient.java:497)
      at org.jbpm.bpel.integration.client.SoapClient.call(SoapClient.java:115)
      at org.jbpm.bpel.integration.jms.JmsIntegrationService.invoke(JmsIntegrationService.java:242)
      at org.jbpm.bpel.graph.basic.Invoke.execute(Invoke.java:46)
      at org.jbpm.bpel.graph.def.Activity.enter(Activity.java:105)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.bpel.graph.def.Activity.leave(Activity.java:184)
      at org.jbpm.bpel.graph.basic.Assign.execute(Assign.java:55)
      at org.jbpm.bpel.graph.def.Activity.enter(Activity.java:105)
      at org.jbpm.graph.def.Transition.take(Transition.java:151)
      at org.jbpm.graph.def.Node.leave(Node.java:393)
      at org.jbpm.bpel.graph.def.Activity.leave(Activity.java:184)
      at org.jbpm.bpel.graph.struct.ProcessInstanceStarter.visit(ProcessInstanceStarter.java:66)
      at org.jbpm.bpel.graph.basic.Receive.accept(Receive.java:81)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:185)
      at org.jbpm.bpel.graph.basic.Receive$$EnhancerByCGLIB$$9222be5b.accept(<generated>)
      at org.jbpm.bpel.graph.struct.ProcessInstanceStarter.visit(ProcessInstanceStarter.java:100)
      at org.jbpm.bpel.graph.struct.Sequence.accept(Sequence.java:104)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:185)
      at org.jbpm.bpel.graph.def.Activity$$EnhancerByCGLIB$$9e9c8226.accept(<generated>)
      at org.jbpm.bpel.graph.struct.ProcessInstanceStarter.visit(ProcessInstanceStarter.java:54)
      at org.jbpm.bpel.graph.def.BpelDefinition.messageReceived(BpelDefinition.java:111)
      at org.jbpm.bpel.integration.jms.StartListener.onMessage(StartListener.java:124)
      at org.jboss.mq.SpyMessageConsumer.run(SpyMessageConsumer.java:696)
      at java.lang.Thread.run(Thread.java:595)

      The fault message that I receive is this:
      <soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
      <soapenv:Header/>
      <soapenv:Body>
      <env:Fault xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
      <faultcode>soapenv:Server.generalException</faultcode>
      <faultstring></faultstring>
      <detail>
      <ns1:exceptionName xmlns:ns1='http://xml.apache.org/axis/'>dns.DNSFault</ns1:exceptionName>
      <ns2:hostname xmlns:ns2='http://xml.apache.org/axis/'>medea</ns2:hostname>
      </detail>
      </env:Fault></soapenv:Body></soapenv:Envelope>

      I'm using the JBoss AS 4.05 and the BPEL engine jbpm-bpel.1.1.Beta3. To develop the DNS web service I use the Eclipse WTP 3.2 version.
      I think that the fault message is not correct, but I don't know well what kind of fault messages expects the bpel engine.
      Any ideas??

      Thank you all and sorry for the long post

      Agus