[ http://issues.apache.org/jira/browse/AXIS2-572?page=all ]

Deepal Jayasinghe reassigned AXIS2-572:
---------------------------------------

    Assign To: Deepal Jayasinghe

> Callback timeout incorrectly reported as an AxisFault( null )
> -------------------------------------------------------------
>
>          Key: AXIS2-572
>          URL: http://issues.apache.org/jira/browse/AXIS2-572
>      Project: Apache Axis 2.0 (Axis2)
>         Type: Bug

>   Components: client-api
>     Versions: 0.95
>     Reporter: rnell
>     Assignee: Deepal Jayasinghe
>  Attachments: ServiceClient.diff, ServiceClient.diff
>
> The code in ServiceClient.java:418 that waits for a callback reply throws a 
> generic AxisFault( null ) when there is a timeout. Would expect a 
> "responseTimeOut" exception. 
> Also the callback.wait( timeout ) can end prematurely and that situation 
> needs to be handled, see the javadoc for Object.wait(long timeout):
> Current code in ServiceClient.java:418
>        long timeout = options.getTimeOutInMilliSeconds();
>        synchronized (callback) {
>                 try {
>                               callback.wait(timeout);
>                 } catch (InterruptedException e) {
>                               throw new AxisFault(Messages
>                                                 
> .getMessage("responseTimeOut"));
>                 }
>        }
>        // process the resule of the invocation
>        if (callback.envelope != null) {
>                 // building soap enevlop
>                 callback.envelope.build();
>                 // closing tranport
>                 return callback.envelope.getBody().getFirstElement();
>        } else {
>                 if (callback.error instanceof AxisFault) {
>                               throw (AxisFault) callback.error;
>                 } else {
>                               throw new AxisFault(callback.error);
>                 }
>        }
>        
> Suggested code:
>        long timeout = options.getTimeOutInMilliSeconds();
> *      long waitTime = timeout;
> *      long startTime = System.currentTimeMillis();
>        synchronized (callback) {
> *               while( ! callback.isComplete() && waitTime >= 0 ) {
>                               try {
>                                        callback.wait(timeout);
>                               } catch (InterruptedException e) {
> *                                      // We were interrupted for some 
> reason, keep waiting
> *                                      // or throw new AxisFault( "Callback 
> was interrupted by someone?" );
>                               }
> *                             // The wait finished, compute remaining time
> *                             // - wait can end prematurly, see Object.wait( 
> int timeout )
> *                             waitTime = timeout - ( 
> System.currentTimeMillis() - startTime );
>                 }
>        }
>        // process the resule of the invocation
>        if (callback.envelope != null) {
>                 // building soap enevlop
>                 callback.envelope.build();
>                 // closing tranport
>                 return callback.envelope.getBody().getFirstElement();
>        } else {
>                 if (callback.error instanceof AxisFault) {
>                               throw (AxisFault) callback.error;
>                 } else if( callback.error != null ) {
>                               throw new AxisFault(callback.error);
> *               } else if( ! callback.isComplete() ) {
> *                             throw new AxisFault(Messages.getMessage( 
> "responseTimeOut" ) );
> *               } else
> *                             throw new AxisFault( "Callback completed but 
> there was no envelope or error" );
>  }
>  
>  
> This change is necessary because we are quering the isComplete() above.  
> Shouldn't call notify() until the setComplete() has been called.
> Current code in ServiceClient.java:594.
>     public void onComplete(AsyncResult result) {
>                 this.envelope = result.getResponseEnvelope();
>                 this.msgctx = result.getResponseMessageContext();
>                 synchronized (this) {
>                               notify();
>                 }
>        }
> Suggested code in CallbackReceiver:35 
>        public void onComplete(AsyncResult result) {
>                 this.envelope = result.getResponseEnvelope();
>                 this.msgctx = result.getResponseMessageContext();
> *      }
> *      public void setComplete( boolean complete ) {
> *               super.setComplete( complete );
> *               synchronized (this) {
> *                             notify();
> *               }
> *      }

-- 
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