BPEL Problem: Fault Handler
agusgr Nov 7, 2007 6:30 AMHi, 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