[
http://issues.apache.org/jira/browse/AXIS2-741?page=comments#action_12412226 ]
Ali Sadik Kumlali commented on AXIS2-741:
-----------------------------------------
When I changed the receiveFault() to enable it handling CallbackReceiver, it
worked. But I'm not very sure of my solution since I've made too many
assumption here:
1) When AxisServlet catches AxisFault it;
- Sets content type to text/xml
- Sets status to HTTP 202
- Sends the actual error (soap fault) over the replyTo/faultTo channel by
invoking handleFault ().
Thus, it assumes that AxisFault is an bussiness exception not an transport
exception. So, it allows the client to close the first connection and retrieve
the actual error over the second.
2) In receiveFault () we should explicitly find the callback instance and need
to pass the actual error message retrieved from the second channel to it. Then
we need to it's completed flag to true to prevent time-out exception.
May be I'm assuming too much thing here and there is a very simple and correct
way doing these ;-)
Here is the change I made:
-----------------------------------------------------
// AxisEngine
public void receiveFault(MessageContext msgContext) throws AxisFault {
log.info(Messages.getMessage("receivederrormessage",
msgContext.getMessageID()));
ConfigurationContext confContext = msgContext.getConfigurationContext();
ArrayList preCalculatedPhases =
confContext.getAxisConfiguration().getInFaultFlow();
// Set the initial execution chain in the MessageContext to a *copy* of
what
// we got above. This allows individual message processing to change
the chain without
// affecting later messages.
msgContext.setExecutionChain((ArrayList) preCalculatedPhases.clone());
msgContext.setFLOW(MessageContext.IN_FAULT_FLOW);
invoke(msgContext);
///////////////////////////////
// My addition
///////////////////////////////
CallbackReceiver receiver = (CallbackReceiver)
msgContext.getAxisOperation().getMessageReceiver();
// This method is not found in 1.0 release. Added with 406920 revision.
HashMap callbackStore = receiver.getCallbackStore();
RelatesTo relatesTO = msgContext.getOptions().getRelatesTo();
String messageID = relatesTO.getValue();
Callback callback = (Callback) callbackStore.remove(messageID);
callback.onError(new AxisFault ("Server sent an error!", "errorCode"));
// Actual error must be passed here
callback.setComplete(true);
}
> "Transport error 500" for EchoBlockingDualClient & echoF
> --------------------------------------------------------
>
> Key: AXIS2-741
> URL: http://issues.apache.org/jira/browse/AXIS2-741
> Project: Apache Axis 2.0 (Axis2)
> Type: Bug
> Versions: 1.0
> Environment: Win 2K Pro, JDK 1.4, Tomcat 5.5
> Reporter: Ali Sadik Kumlali
> Attachments: message_flow.txt
>
> When I use EchoBlockingDualClient to invoke echoF service which throws
> AxisFault, I run into a strange(?) situation.
> Server returnes back an error through the *first* channel. Error says
> "Transport error 500 . Error Message is <html><head><title>Apache
> Tomcat/5.5.14 - Error report...". Then it sends the actual error over the
> *second* channel.
> When I look at the server logs, there is only one trace that indicates the
> AxisFault error thrown by echoF. There seems no transport related errors.
> However, client catches *only* the first error and writes it down to the
> console. Then, it throws another exception that says
> "org.apache.axis2.AxisFault: Time out while waiting for the server to send
> the response"
> I tried followings:
> - Throwing XMLStreamException instead of AxisFault for conforming the
> original echo sample.
> - Adding FaultTo EPR to the request.
> Neither of them worked.
> Since separate listener case is very important, I beleive this is actually a
> blocker issue. (If I'm not missing something)
> --------------------------------------------------------------------
> public OMElement echoF(OMElement element) throws AxisFault {
> throw new AxisFault("MyFault message", "MyFaultCode");
> }
> --------------------------------------------------------------------
> - Transport error 500 . Error Message is <html><head><title>Apache
> Tomcat/5.5.14 - Error report</title><style><!--H1
> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
> H2
> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;}
> H3
> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;}
> BODY
> {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;}
> B
> {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;}
> P
> {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A
> {color : black;}A.name {color : black;}HR {color : #525D76;}--></style>
> </head><body><h1>HTTP Status 500 - </h1><HR size="1"
> noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b>
> <u></u></p><p><b>description</b> <u>The server encountered an internal
> error () that prevented it from fulfilling this request.</u></p><HR
> size="1" noshade="noshade"><h3>Apache Tomcat/5.5.14</h3></body></html>;
> nested exception is:
> ...
> org.apache.axis2.AxisFault: Time out while waiting for the server to
> send the response[SimpleHTTPServer] Stop called
> at
> org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:448)
> at
> org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:399)
> at
> userguide.clients.EchoBlockingDualClient.main(EchoBlockingDualClient.java:54)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira