You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "rnell (JIRA)" <ji...@apache.org> on 2006/04/17 18:39:18 UTC

[jira] Updated: (AXIS2-572) Callback timeout incorrectly reported as an AxisFault( null )

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

rnell updated AXIS2-572:
------------------------

    Attachment: ServiceClient.diff

Diff attached.

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