FileDocCategorySizeDatePackage
ClientCommunicatorAdmin.javaAPI DocJava SE 6 API5227Tue Jun 10 00:22:04 BST 2008com.sun.jmx.remote.internal

ClientCommunicatorAdmin

public abstract class ClientCommunicatorAdmin extends Object

(Omit source code)

Fields Summary
private final Checker
checker
private long
period
private static final int
CONNECTED
private static final int
RE_CONNECTING
private static final int
FAILED
private static final int
TERMINATED
private int
state
private final int[]
lock
private static final ClassLogger
logger
Constructors Summary
public ClientCommunicatorAdmin(long period)

	this.period = period;

	if (period > 0) {
	    checker = new Checker();

	    Thread t = new Thread(checker);
	    t.setDaemon(true);
	    t.start();
	} else
	    checker = null;
    
Methods Summary
protected abstract voidcheckConnection()
Called by this class to check a client connection.

protected abstract voiddoStart()
Tells a client to re-start again.

protected abstract voiddoStop()
Tells a client to stop because failing to call checkConnection.

public voidgotIOException(java.io.IOException ioe)
Called by a client to inform of getting an IOException.

	restart(ioe);
    
private voidrestart(java.io.IOException ioe)

	// check state
	synchronized(lock) {
	    if (state == TERMINATED) {
		throw new IOException("The client has been closed.");
	    } else if (state == FAILED) { // already failed to re-start by another thread
		throw ioe;
	    } else if (state == RE_CONNECTING) {
		// restart process has been called by another thread
		// we need to wait
		while(state == RE_CONNECTING) {
		    try {
			lock.wait();
		    } catch (InterruptedException ire) {
			// be asked to give up
			InterruptedIOException iioe = new InterruptedIOException(ire.toString());
			EnvHelp.initCause(iioe, ire);

			throw iioe;
		    }
		}

		if (state == TERMINATED) {
		    throw new IOException("The client has been closed.");
		} else if (state != CONNECTED) {
		    // restarted is failed by another thread
		    throw ioe;
		}
	    } else {
		state = RE_CONNECTING;
		lock.notifyAll();
	    }
	}

	// re-starting
	try {
	    doStart();
	    synchronized(lock) {
		if (state == TERMINATED) {
		    throw new IOException("The client has been closed.");
		}

		state = CONNECTED;

		lock.notifyAll();
	    }

	    return;
	} catch (Exception e) {
	    logger.warning("restart", "Failed to restart: " + e);
	    logger.debug("restart",e);

	    synchronized(lock) {
		if (state == TERMINATED) {
		    throw new IOException("The client has been closed.");
		}

		state = FAILED;

		lock.notifyAll();
	    }

	    try {
		doStop();
	    } catch (Exception eee) {
		// OK.
		// We know there is a problem.
	    }

	    terminate();

	    throw ioe;
	}
    
public voidterminate()
Terminates this object.

	synchronized(lock) {
	    if (state == TERMINATED) {
		return;
	    }

	    state = TERMINATED;

	    lock.notifyAll();

	    if (checker != null)
		checker.stop();
	}