diff options
Diffstat (limited to 'java/src/IceInternal/ProxyFactory.java')
-rw-r--r-- | java/src/IceInternal/ProxyFactory.java | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/java/src/IceInternal/ProxyFactory.java b/java/src/IceInternal/ProxyFactory.java index 926de612160..c03b3fbe5be 100644 --- a/java/src/IceInternal/ProxyFactory.java +++ b/java/src/IceInternal/ProxyFactory.java @@ -81,14 +81,67 @@ public final class ProxyFactory } } - public int[] - getRetryIntervals() - { - return _retryIntervals; + public int + checkRetryAfterException(Ice.LocalException ex, int cnt) + { + ++cnt; + + TraceLevels traceLevels = _instance.traceLevels(); + Ice.Logger logger = _instance.logger(); + + // + // Instance components may be null if Communicator has been destroyed. + // + if(traceLevels != null && logger != null) + { + if(cnt > _retryIntervals.length) + { + if(traceLevels.retry >= 1) + { + String s = "cannot retry operation call because retry limit has been exceeded\n" + ex.toString(); + logger.trace(traceLevels.retryCat, s); + } + throw ex; + } + + if(traceLevels.retry >= 1) + { + String s = "re-trying operation call"; + if(cnt > 0 && _retryIntervals[cnt - 1] > 0) + { + s += " in " + _retryIntervals[cnt - 1] + "ms"; + } + s += " because of exception\n" + ex; + logger.trace(traceLevels.retryCat, s); + } + + if(cnt > 0) + { + // + // Sleep before retrying. + // + try + { + Thread.currentThread().sleep(_retryIntervals[cnt - 1]); + } + catch(InterruptedException ex1) + { + } + } + + return cnt; + } + else + { + // + // Impossible to retry after Communicator has been destroyed. + // + throw ex; + } } // - // Only for use by Instance + // Only for use by Instance. // ProxyFactory(Instance instance) { |