Listing 1

<problomatic-configuration>
<default-properties
<handler="com.stieglitech.problomatic.handlers.EmailNotificationHandler">
<property name="mail.smtp.host" value="my.mail.server"/>
	    	</handler>
</default-properties>
    	<define-chain problem="com.stieglitech.problomatic.problems.RawProblem">
        	<chain-link
			handler="com.stieglitech.problomatic.handlers.SystemPrintlnHandler"/>
	     	<chain-link
			handler="com.stiegltiech.problematic.handlers.EmailNotificationHandler"/>
</define-chain>
</problomatic-configuration>


Listing 2

public class DatabaseFailover implements Recoverable {
	private int recoveryAttempts = 0;
	private java.sql.Connection con;
	private boolean isConnected = false;

	public void attemptedRecovery() {
		recoveryAttempts++;
	}

	public boolean canRecover() {
		if (getRecoveryAttemptsCount() < getMaximumRecoveryAttempts()) {
			return true;
		} else {
			return false;
		}
	}

	public void doDatabaseWork() { // insert, delete, update, whatever }

	public void connectToDatabase() {
		try {
			con = DriverManager.getConnection(PRIMARY_DB_URL, DB_USER,
					DB_PASS));
		} catch (SQLException e) {
			DatabaseProblem prob = new DatabaseProblem(e);
			prob.setSource(this);
			Problomatic.handleProblem(prob);
		}
	}

	public void execute() {
		while (canRecover() && !isConnected()) {
			connectToDatabase();
		}
		doDatabaseWork(getConnection());
		closeConnection();
	}

	public void setConnection(Connection con) {
		this.connection = con;
	}
}


Listing 3

public class DatabaseRetryHandler
implements com.stieglitech.problomatic.ProblemHandler {

	public void handleProblem(Problem aProblem) {
		if (aProblem instanceof DatabaseProblem) {
			DatabaseProblem dbProb = (DatabaseProblem) aProblem;
			Recoverable source = (Recoverable) dbProb.getSource();
			Connection con = getAlternateConnection();
			if (con!=null) {
				source.setConnection(con);
				source.setConnected(true);
}
else {
	source.setConnected(false);
}
source.attemptedRecovery();
		}
	}

	private Connection getAlternateConnection()
	{ // get alternate connection }
}