[ 
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

Reply via email to