User: slaboure Date: 01/09/30 08:19:32 Added: src/main/org/jboss/ha/framework/interfaces DistributedReplicantManager.java DistributedState.java HAPartition.java HARMIClient.java HARMIProxy.java HARMIResponse.java HARMIServer.java LoadBalancePolicy.java RoundRobin.java Log: moved client side files of the HA framework from org.jboss.ha to org.jboss.ha.framework.interfaces Revision Changes Path 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/DistributedReplicantManager.java Index: DistributedReplicantManager.java =================================================================== package org.jboss.ha.framework.interfaces; import java.util.ArrayList; import java.io.Serializable; import java.rmi.Remote; import java.rmi.RemoteException; public interface DistributedReplicantManager extends Remote { /** * When a particular key in the DistributedReplicantManager table gets modified, all listeners * will be notified of replicant changes for that key. */ public interface ReplicantListener { public void replicantsChanged(String key, ArrayList newReplicants); } public void registerListener(String key, ReplicantListener subscriber) throws Exception; public void unregisterListener(String key, ReplicantListener subscriber) throws Exception; // State binding methods // /** * remove the entire key from the ReplicationService */ public void remove(String key) throws Exception;; /** * Add a replicant, it will be attached to this cluster node */ public void add(String key, Serializable replicant) throws Exception; /** * Lookup the replicant attached to this cluster node */ public Serializable lookupLocalReplicant(String key) throws Exception; /** * Return a list of all replicants. */ public ArrayList lookupReplicants(String key) throws Exception; } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/DistributedState.java Index: DistributedState.java =================================================================== package org.jboss.ha.framework.interfaces; import java.util.Collection; import java.io.Serializable; import java.rmi.Remote; import java.rmi.RemoteException; public interface DistributedState extends Remote { /** * When a particular key in the DistributedState table gets modified, all listeners * will be notified of replicant changes for that key. Keys are organized in categories. */ public interface DSListener { public void valueHasChanged(String category, String key, Serializable value); public void keyHasBeenRemoved (String category, String key, Serializable previousContent); } public void registerDSListener(String category, DSListener subscriber) throws RemoteException; public void unregisterDSListener(String category, DSListener subscriber) throws RemoteException; // State binding methods // /** * remove the entire key from the ReplicationService */ public void remove(String category, String key) throws Exception; /** * Associates a value to a key in a specific category */ public void set(String category, String key, Serializable value) throws Exception; /** * Lookup the replicant attached to this cluster node */ public Serializable get(String category, String key) throws RemoteException; /** * Return a list of all categories. */ public Collection getAllCategories() throws RemoteException; /** * Return a list of all keys in a category. */ public Collection getAllKeys(String category) throws RemoteException; /** * Return a list of all values in a category. */ public Collection getAllValues(String category) throws RemoteException; } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/HAPartition.java Index: HAPartition.java =================================================================== /* * JBoss, the OpenSource J2EE WebOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.ha.framework.interfaces; import java.util.ArrayList; import java.util.Vector; import java.io.Serializable; public interface HAPartition { // General methods // public String getNodeName(); public String getPartitionName(); public DistributedReplicantManager getDistributedReplicantManager(); public DistributedState getDistributedStateService (); // *************************** // *************************** // RPC multicast communication // *************************** // *************************** // public void registerRPCHandler(String objectName, Object handler); public void unregisterRPCHandler(String objectName, Object subscriber); // Called only on all members of this partition on all nodes // (not subpartitions or other partitions) // public ArrayList callMethodOnCluster(String objectName, String methodName, Object[] args, boolean excludeSelf) throws Exception; // ************************* // ************************* // State transfer management // ************************* // ************************* // public interface HAPartitionStateTransfer { public Serializable getCurrentState (); public void setCurrentState(Serializable newState); } public void subscribeToStateTransferEvents (String objectName, HAPartition.HAPartitionStateTransfer subscriber) throws Exception; public void unsubscribeFromStateTransferEvents (String objectName, HAPartition.HAPartitionStateTransfer subscriber); // ************************* // ************************* // Group Membership listeners // ************************* // ************************* // public interface HAMembershipListener { public void membershipChanged(Vector deadMembers, Vector newMembers, Vector allMembers); } public void registerMembershipListener(HAMembershipListener listener); public void unregisterMembershipListener(HAMembershipListener listener); } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/HARMIClient.java Index: HARMIClient.java =================================================================== /* * JBoss, the OpenSource J2EE WebOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.ha.framework.interfaces; import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import java.util.Vector; import java.util.ArrayList; import java.util.HashMap; import java.rmi.ConnectException; import java.rmi.ConnectIOException; import java.rmi.NoSuchObjectException; import java.rmi.UnknownHostException; import java.rmi.RemoteException; import java.rmi.ServerException; import java.rmi.MarshalledObject; import org.jboss.ejb.plugins.jrmp.interfaces.RemoteMethodInvocation; /** * * * @author <a href="mailto:[EMAIL PROTECTED]">Sacha Labourey</a> * @author <a href="mailto:[EMAIL PROTECTED]">Bill Burke</a> * @version $Revision: 1.1 $ * * <p><b>Revisions:</b> * * <p><b>20010831 Bill Burke:</b> * <ul> * <li> First import of sources * </ul> */ public class HARMIClient implements java.io.Serializable, java.lang.reflect.InvocationHandler, HARMIProxy { protected String key = null; protected ArrayList targets = null; protected LoadBalancePolicy loadBalancePolicy; protected transient long tag = 0; protected transient Object local = null; public HARMIClient () {} public HARMIClient (ArrayList targets, LoadBalancePolicy policy, String key) { this.targets = targets; this.loadBalancePolicy = policy; this.loadBalancePolicy.init (this); this.key = key; } public HARMIClient (ArrayList targets, LoadBalancePolicy policy, String key, Object local) { this.targets = targets; this.loadBalancePolicy = policy; this.loadBalancePolicy.init (this); this.key = key; this.local = local; } public boolean isLocal () { return local != null; } public ArrayList getTargets () { return targets; } public void setTargets (ArrayList newTargets) { synchronized(targets) { targets.clear (); targets.addAll (newTargets); } } public long getTag () { return tag; } public void setTag (long tag) { this.tag = tag; } public Object getRemoteTarget () { System.out.println ("number of targets: " + targets.size ()); if (targets.size () == 0) { return null; } synchronized (targets) { return loadBalancePolicy.chooseTarget (targets); } } public void remoteTargetHasFailed (Object target) { removeDeadTarget (target); } protected void removeDeadTarget (Object target) { //System.out.println("Size before : " + Integer.toString(targets.length)); if (targets != null) { synchronized (targets) { //System.out.println("removeDeadTarget has been called"); int length = targets.size (); for (int i=0; i<length; ++i) { if (targets.get (i) == target) { targets.remove (i); return; } } } } // nothing found } public Method findLocalMethod (Method method, Object[] args) throws Exception { return method; } public Object invoke (Object proxy, Method method, Object[] args) throws Throwable { // The isLocal call is handled by the proxy // if (method.getName ().equals ("isLocal") && (args == null || args.length == 0)) { return method.invoke (this, args); } // we try to optimize the call locally first // if (local != null) { try { System.out.println ("collocated call"); Method localMethod = findLocalMethod (method, args); return localMethod.invoke (local, args); } catch (InvocationTargetException ite) { throw ite.getTargetException (); } } else { return invokeRemote (null, method, args); } } public Object invokeRemote (Object proxy, Method method, Object[] args) throws Throwable { HARMIServer target = (HARMIServer)getRemoteTarget (); while (target != null) { try { RemoteMethodInvocation rmi = new RemoteMethodInvocation (null, method, args); MarshalledObject mo = new MarshalledObject (rmi); // Is this step actually necessary? Can I just do method.invoke(target, args); ? HARMIResponse rsp = target.invoke (tag, mo); if (rsp.newReplicants != null) { System.out.println ("new set of replicants"); setTargets (rsp.newReplicants); setTag (rsp.tag); } return rsp.response; } catch (ConnectException ce) { } catch (ConnectIOException cioe) { } catch (NoSuchObjectException nsoe) { } catch (UnknownHostException uhe) { } // If we reach here, this means that we must fail-over remoteTargetHasFailed (target); target = (HARMIServer)getRemoteTarget (); } // if we get here this means list was exhausted throw new RemoteException ("Service unavailable."); } private void readObject (java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { this.key = (String)stream.readUTF (); this.targets = (ArrayList)stream.readObject (); this.loadBalancePolicy = (LoadBalancePolicy)stream.readObject (); HARMIServer server = (HARMIServer)HARMIServer.rmiServers.get (key); this.loadBalancePolicy.init (this); if (server != null) { synchronized(targets) { try { targets = server.getReplicants (); local = server.getLocal (); } catch (Exception ignored) {} } } } private void writeObject (java.io.ObjectOutputStream stream) throws IOException { stream.writeUTF (key); stream.writeObject (targets); stream.writeObject (loadBalancePolicy); } } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/HARMIProxy.java Index: HARMIProxy.java =================================================================== package org.jboss.ha.framework.interfaces; public interface HARMIProxy extends java.io.Serializable { public boolean isLocal(); } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/HARMIResponse.java Index: HARMIResponse.java =================================================================== package org.jboss.ha.framework.interfaces; import java.util.ArrayList; public class HARMIResponse implements java.io.Serializable { public ArrayList newReplicants = null; public long tag = 0; public Object response = null; } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/HARMIServer.java Index: HARMIServer.java =================================================================== package org.jboss.ha.framework.interfaces; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import java.util.Vector; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Collection; import java.io.Serializable; import java.rmi.Remote; import java.rmi.server.RemoteStub; import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException; import java.rmi.MarshalledObject; import org.jboss.logging.Logger; import org.jboss.ejb.plugins.jrmp.interfaces.RemoteMethodInvocation; /** * */ public interface HARMIServer extends Remote { public HARMIResponse invoke(long tag, MarshalledObject mimo) throws Exception; public ArrayList getReplicants() throws Exception; public Object getLocal() throws Exception; public static Hashtable rmiServers = new Hashtable(); } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/LoadBalancePolicy.java Index: LoadBalancePolicy.java =================================================================== package org.jboss.ha.framework.interfaces; import java.util.ArrayList; public interface LoadBalancePolicy extends java.io.Serializable { // Init method called by the HARMIProxy so that the implementation // can use HARMIClient data to take its decision // public void init (HARMIClient father); public Object chooseTarget (ArrayList targets); } 1.1 jbossmx/src/main/org/jboss/ha/framework/interfaces/RoundRobin.java Index: RoundRobin.java =================================================================== package org.jboss.ha.framework.interfaces; import java.util.ArrayList; public class RoundRobin implements LoadBalancePolicy { protected transient int cursorRemote = 0; public void init (HARMIClient father) { // do not use the HARMIClient in this policy } public Object chooseTarget(ArrayList targets) { cursorRemote = ( (cursorRemote + 1) % targets.size() ); return targets.get(cursorRemote); } }
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development