001: package org.jacorb.notification.engine;
002:
003: /*
004: * JacORB - a free Java ORB
005: *
006: * Copyright (C) 1997-2004 Gerald Brose.
007: *
008: * This library is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Library General Public
010: * License as published by the Free Software Foundation; either
011: * version 2 of the License, or (at your option) any later version.
012: *
013: * This library is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * Library General Public License for more details.
017: *
018: * You should have received a copy of the GNU Library General Public
019: * License along with this library; if not, write to the Free
020: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
021: */
022:
023: import org.apache.avalon.framework.logger.Logger;
024: import org.jacorb.notification.interfaces.IProxyPushSupplier;
025: import org.jacorb.notification.util.LogUtil;
026: import org.omg.CORBA.OBJECT_NOT_EXIST;
027: import org.omg.CosEventComm.Disconnected;
028:
029: /**
030: * @author Alphonse Bendt
031: * @version $Id: AbstractRetryStrategy.java,v 1.5 2005/08/21 13:30:16 alphonse.bendt Exp $
032: */
033: public abstract class AbstractRetryStrategy implements RetryStrategy {
034: protected final Logger logger_ = LogUtil.getLogger(getClass()
035: .getName());
036:
037: protected final PushOperation pushOperation_;
038:
039: protected final IProxyPushSupplier pushSupplier_;
040:
041: private boolean active_ = true;
042:
043: // //////////////////////////////////////
044:
045: public AbstractRetryStrategy(IProxyPushSupplier pushSupplier,
046: PushOperation operation) {
047: pushSupplier_ = pushSupplier;
048: pushOperation_ = operation;
049: }
050:
051: // //////////////////////////////////////
052:
053: public void dispose() {
054: pushOperation_.dispose();
055: }
056:
057: protected boolean isRetryAllowed() {
058: return active_ && pushSupplier_.isRetryAllowed();
059: }
060:
061: protected void remoteExceptionOccured(Exception error)
062: throws RetryException {
063: logger_.debug("Error during retry", error);
064:
065: if (isFatalException(error)) {
066: if (!pushSupplier_.isDestroyed()) {
067: pushSupplier_.destroy();
068: }
069: active_ = false;
070:
071: throw new RetryException(
072: "fatal exception while retrying push");
073: }
074:
075: pushSupplier_.incErrorCounter();
076:
077: if (!isRetryAllowed()) {
078: if (!pushSupplier_.isDestroyed()) {
079: pushSupplier_.destroy();
080: }
081: active_ = false;
082:
083: throw new RetryException("no more retries. giving up.");
084: }
085:
086: waitUntilNextTry();
087: }
088:
089: public static boolean isFatalException(Exception error) {
090: if (error instanceof OBJECT_NOT_EXIST) {
091: return true;
092: } else if (error instanceof Disconnected) {
093: return true;
094: }
095:
096: return false;
097: }
098:
099: protected abstract long getTimeToWait();
100:
101: public final void retry() throws RetryException {
102: if (isRetryAllowed()) {
103: waitUntilNextTry();
104:
105: retryInternal();
106: } else {
107: dispose();
108: }
109: }
110:
111: protected abstract void retryInternal() throws RetryException;
112:
113: private void waitUntilNextTry() {
114: long timeToWait = getTimeToWait();
115:
116: try {
117: if (timeToWait > 0) {
118: Thread.sleep(timeToWait);
119: }
120: } catch (InterruptedException ignored) {
121: // ignored
122: }
123: }
124: }
|