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 "Deepal Jayasinghe (JIRA)" <ji...@apache.org> on 2006/04/18 15:20:19 UTC
[jira] Resolved: (AXIS2-572) Callback timeout incorrectly reported
as an AxisFault( null )
[ http://issues.apache.org/jira/browse/AXIS2-572?page=all ]
Deepal Jayasinghe resolved AXIS2-572:
-------------------------------------
Resolution: Fixed
Applied the patch , the problem was I had not understand the patch correctly , I am sorry for that and thx for the patch
> 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