001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.ha.framework.interfaces;
023:
024: import org.jboss.ha.framework.interfaces.DistributedReplicantManager.ReplicantListener;
025: import java.io.Serializable;
026: import java.util.List;
027: import java.util.Collection;
028:
029: /**
030: *
031: * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>.
032: * @author <a href="mailto:sacha.labourey@cogito-info.ch">Sacha Labourey</a>.
033: * @version $Revision: 57188 $
034: *
035: * <p><b>Revisions:</b><br>
036: * <p><b>2001/10/31: marcf</b>
037: * <ol>
038: * <li>DRM is no longer remote
039: * </ol>
040: * <p><b>2002/08/23: Sacha Labourey</b>
041: * <ol>
042: * <li>added isMasterReplica
043: * </ol>
044: */
045: public interface DistributedReplicantManager {
046: /**
047: * When a particular key in the DistributedReplicantManager table gets modified, all listeners
048: * will be notified of replicant changes for that key.
049: */
050: public interface ReplicantListener {
051: /**
052: * Callback called when the content/list of replicant for a given replicant key has changed
053: * @param key The name of the key of the replicant that has changed
054: * @param newReplicants The list of new replicants for the give replicant key.
055: * This list will be in a consistent order on all
056: * cluster nodes on which the current viewId is
057: * in effect
058: * @param newReplicantsViewId The new replicant view id corresponding to this change
059: */
060: public void replicantsChanged(String key, List newReplicants,
061: int newReplicantsViewId);
062: }
063:
064: /**
065: * Subscribe a new listener {@link ReplicantListener} for replicants change
066: * @param key Name of the replicant, must be identical cluster-wide for all identical replicants
067: * @param subscriber The subsribing {@link ReplicantListener}
068: */
069: public void registerListener(String key,
070: ReplicantListener subscriber);
071:
072: /**
073: * Unsubscribe a listener {@link ReplicantListener} that had subscribed for replicants changes
074: * @param key Name of the replicant, must be identical cluster-wide for all identical replicants
075: * @param subscriber The unsubscribing {@link ReplicantListener}
076: */
077: public void unregisterListener(String key,
078: ReplicantListener subscriber);
079:
080: // State binding methods
081: //
082:
083: /**
084: * Add a replicant, it will be attached to this cluster node
085: * @param key Replicant name. All replicas around the cluster must use the same key name.
086: * @param replicant Local data of the replicant, that is, any serializable data
087: * @throws Exception Thrown if a cluster communication problem occurs
088: */
089: public void add(String key, Serializable replicant)
090: throws Exception;
091:
092: /**
093: * Remove the entire key from the ReplicationService
094: * @param key Name of the replicant
095: * @throws Exception Thrown if a cluster communication problem occurs
096: */
097: public void remove(String key) throws Exception;
098:
099: /**
100: * Lookup the replicant attached to this cluster node
101: * @param key The name of the replicant
102: * @return The local replicant for the give key name
103: */
104: public Serializable lookupLocalReplicant(String key);
105:
106: /**
107: * Return a list of all replicants.
108: * @param key The replicant name
109: * @return An list of serialized replicants available around the cluster
110: * for the given key. This list will be in the same order in all
111: * nodes in the cluster.
112: */
113: public List lookupReplicants(String key);
114:
115: /**
116: * Return a list of all replicants node names.
117: * @param key The replicant name
118: * @return A list the node names of cluster nodes that have made available
119: * a replicant for the given key. This list will be in the same
120: * order in all nodes in the cluster.
121: */
122: public List lookupReplicantsNodeNames(String key);
123:
124: /**
125: * Return a list of all services that have a least one replicant.
126: * @return A collection of services names (String)
127: */
128: public Collection getAllServices();
129:
130: /**
131: * Returns an id corresponding to the current view of this set of replicants.
132: * @param key The replicant name
133: * @return A view id (doesn't grow sequentially)
134: */
135: public int getReplicantsViewId(String key);
136:
137: /**
138: * Indicates if the current node is the master replica for this given key.
139: * @param key The replicant name
140: * @return True if this node is the master
141: */
142: public boolean isMasterReplica(String key);
143:
144: }
|