Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OBSERVER ET OBSERVABLE EN RMI


Information sur la source

Catégorie :Api Classé sous : observer, observable, rmi Niveau : Débutant Date de création : 23/01/2006 Vu / téléchargé: 7 653 / 770

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

L'observer et l'observable sert à modéliser des vues et de faire des actions communes sur chacune. Anisi, dans le cadre d'un client/serveur, les données qui ont changées par un utilisateur seront apparents pour les autres utilisateurs (notion de rafraîchissement de données). Or le problème, en RMI, c'est que ces deux classes sympathiques ne peuvent pas fonctionner. Ainsi, j'ai fait un petit package util et fonctionnel (utilisation de Publishing et de Subscribing).

Voilà
 

Source

  • /*
  • * Created on 22 janv. 2006
  • *
  • * TODO To change the template for this generated file go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • package observer;
  • import java.io.Serializable;
  • import java.rmi.Remote;
  • import java.rmi.RemoteException;
  • /**
  • * @author Julien
  • *
  • * TODO To change the template for this generated type comment go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • public interface Subscriber extends Remote, Serializable {
  • public void update(Object pub, Object code) throws RemoteException;
  • }
  • /////////////////////////////////////////////////////////////////////////////////
  • /*
  • * Created on 22 janv. 2006
  • *
  • * TODO To change the template for this generated file go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • package observer;
  • import java.rmi.Remote;
  • import java.rmi.RemoteException;
  • /**
  • * @author Julien
  • *
  • * TODO To change the template for this generated type comment go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • public interface Publisher extends Remote {
  • public void addSubscriber(Subscriber s) throws RemoteException;
  • public void notifyAllSubscribers()throws RemoteException;
  • public void removeSubscriber(Subscriber s) throws RemoteException;
  • public void removeAllSubscribers() throws RemoteException;
  • }
  • /////////////////////////////////////////////////////////////////
  • /*
  • * Created on 22 janv. 2006
  • *
  • * TODO To change the template for this generated file go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • package observer;
  • import java.io.Serializable;
  • import java.rmi.RemoteException;
  • import java.rmi.server.UnicastRemoteObject;
  • import java.util.Enumeration;
  • import java.util.Vector;
  • /**
  • * @author Julien
  • *
  • * TODO To change the template for this generated type comment go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • public class BasicPublisher extends UnicastRemoteObject implements Publisher, Serializable {
  • private Vector subscribers;
  • public BasicPublisher() throws RemoteException {
  • subscribers = new Vector();
  • }
  • public void addSubscriber(Subscriber s) throws RemoteException {
  • subscribers.addElement(s);
  • }
  • public void notifyAllSubscribers() throws RemoteException {
  • notifySubscribers(null);
  • }
  • public void removeSubscriber(Subscriber s) throws RemoteException {
  • subscribers.removeElement(s);
  • }
  • public void removeAllSubscribers() throws RemoteException {
  • subscribers.removeAllElements();
  • }
  • public void notifySubscribers(Object pub, Object code) {
  • Vector deadSubs = null;
  • Enumeration e = subscribers.elements();
  • while (e.hasMoreElements()) {
  • Subscriber s = (Subscriber) e.nextElement();
  • try {
  • s.update(pub, code);
  • }
  • catch (java.rmi.ConnectException ce) { //serious
  • if (deadSubs == null) deadSubs = new Vector();
  • deadSubs.addElement(s);// must be dead
  • }
  • catch (java.rmi.NoSuchObjectException nsoe){ //serious
  • if (deadSubs == null) deadSubs = new Vector();
  • deadSubs.addElement(s);// must be dead
  • }
  • catch (java.rmi.RemoteException re) {
  • /*might recover?*/
  • }
  • }
  • if (deadSubs != null) {
  • e = deadSubs.elements();
  • while (e.hasMoreElements()) {
  • Subscriber s = (Subscriber) e.nextElement();
  • try {
  • removeSubscriber(s); // forget this subscriber
  • } catch (RemoteException e1) {
  • // TODO Auto-generated catch block
  • e1.printStackTrace();
  • }
  • }
  • }
  • }
  • public void notifySubscribers(Object pub) throws RemoteException {
  • notifySubscribers(pub, null);
  • }
  • }
  • /////////////////////////////////////////////////////////////////////////
  • /*
  • * Created on 22 janv. 2006
  • *
  • * TODO To change the template for this generated file go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • package observer;
  • import java.io.Serializable;
  • import java.rmi.RemoteException;
  • import java.rmi.server.UnicastRemoteObject;
  • /**
  • * @author Julien
  • *
  • * TODO To change the template for this generated type comment go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • public class Publishing extends UnicastRemoteObject implements Publisher, Serializable {
  • BasicPublisher pub;
  • public Publishing() throws RemoteException {
  • pub = new BasicPublisher();
  • }
  • /** Delegate Publisher interface to BasicPublisher */
  • public void addSubscriber(Subscriber s) throws RemoteException {
  • pub.addSubscriber(s);
  • }
  • public void notifyAllSubscribers() throws RemoteException{
  • pub.notifyAllSubscribers();
  • }
  • public void removeSubscriber(Subscriber s) throws RemoteException{
  • pub.removeSubscriber(s);
  • }
  • public void removeAllSubscribers() throws RemoteException {
  • pub.removeAllSubscribers();
  • }
  • }
  • ////////////////////////////////////////////////////////////////////////
  • /*
  • * Created on 22 janv. 2006
  • *
  • * TODO To change the template for this generated file go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • package observer;
  • import java.lang.reflect.*;
  • import java.rmi.RemoteException;
  • import java.rmi.server.UnicastRemoteObject;
  • /**
  • * @author Julien
  • *
  • * TODO To change the template for this generated type comment go to
  • * Window - Preferences - Java - Code Style - Code Templates
  • */
  • public class Subscribing extends UnicastRemoteObject implements Subscriber {
  • //Variables globales
  • private Method methode;
  • private Object instance;
  • private Object[] params;
  • public Subscribing(Object instance, Method methode, Object[] params) throws RemoteException {
  • this.instance = instance;
  • this.methode = methode;
  • this.params = params;
  • this.methode.setAccessible(true);
  • }
  • /* (non-Javadoc)
  • * @see dico.observer.Subscriber#update(java.lang.Object, java.lang.Object)
  • */
  • public void update(Object pub, Object code) throws RemoteException {
  • // TODO Auto-generated method stub
  • try{
  • methode.invoke(instance, params);
  • }
  • catch(Exception e){
  • }
  • }
  • }
/*
 * Created on 22 janv. 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package observer;

import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * @author Julien
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public interface Subscriber extends Remote, Serializable { 
	public void update(Object pub, Object code) throws RemoteException; 
} 

/////////////////////////////////////////////////////////////////////////////////
/*
 * Created on 22 janv. 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package observer;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * @author Julien
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public interface Publisher extends Remote { 
	public void addSubscriber(Subscriber s) throws RemoteException;
	public void notifyAllSubscribers()throws RemoteException;
	public void removeSubscriber(Subscriber s) throws RemoteException; 
	public void removeAllSubscribers() throws RemoteException; 
}
/////////////////////////////////////////////////////////////////
/*
 * Created on 22 janv. 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package observer;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Enumeration;
import java.util.Vector;

/**
 * @author Julien
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class BasicPublisher extends UnicastRemoteObject implements Publisher, Serializable { 
	private Vector subscribers;
	
	public BasicPublisher() throws RemoteException {
		subscribers = new Vector();
	}
	
	public void addSubscriber(Subscriber s) throws RemoteException { 
		subscribers.addElement(s); 
	}
	public void notifyAllSubscribers() throws RemoteException {
		notifySubscribers(null);
	}
	public void removeSubscriber(Subscriber s) throws RemoteException { 
		subscribers.removeElement(s); 
	} 
	public void removeAllSubscribers() throws RemoteException { 
		subscribers.removeAllElements(); 
	} 
	public void notifySubscribers(Object pub, Object code) { 
		Vector deadSubs = null; 
		Enumeration e = subscribers.elements(); 
		while (e.hasMoreElements()) { 
			Subscriber s = (Subscriber) e.nextElement();
			try { 
				s.update(pub, code);
			} 
			catch (java.rmi.ConnectException ce) { //serious 
				if (deadSubs == null) deadSubs = new Vector(); 
				deadSubs.addElement(s);// must be dead 
			} 
			catch (java.rmi.NoSuchObjectException nsoe){ //serious 
				if (deadSubs == null) deadSubs = new Vector(); 
				deadSubs.addElement(s);// must be dead 
			} 
			catch (java.rmi.RemoteException re) { 
				/*might recover?*/ 
			} 
		} 
		if (deadSubs != null) { 
			e = deadSubs.elements(); 
			while (e.hasMoreElements()) { 
				Subscriber s = (Subscriber) e.nextElement(); 
				try {
					removeSubscriber(s);  // forget this subscriber 
				} catch (RemoteException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} 
		} 
	} 
	public void notifySubscribers(Object pub) throws RemoteException { 
		notifySubscribers(pub, null); 
	} 
}
/////////////////////////////////////////////////////////////////////////
/*
 * Created on 22 janv. 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package observer;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * @author Julien
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Publishing extends UnicastRemoteObject implements Publisher, Serializable { 
	  BasicPublisher pub; 
	  
	  public Publishing() throws RemoteException {
	  	pub = new BasicPublisher();
	  }
	  
	  /** Delegate Publisher interface to BasicPublisher */ 
	  public void addSubscriber(Subscriber s) throws RemoteException { 
	    pub.addSubscriber(s);
	  }
	  public void notifyAllSubscribers() throws RemoteException{
	  	pub.notifyAllSubscribers();
	  }
	  public void removeSubscriber(Subscriber s) throws RemoteException{ 
	    pub.removeSubscriber(s); 
	  } 
	  public void removeAllSubscribers() throws RemoteException { 
	    pub.removeAllSubscribers(); 
	  }  
}
////////////////////////////////////////////////////////////////////////
/*
 * Created on 22 janv. 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package observer;
import java.lang.reflect.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * @author Julien
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Subscribing extends UnicastRemoteObject implements Subscriber {
	//Variables globales
	private Method methode;
	private Object instance;
	private Object[] params;
	
	public Subscribing(Object instance, Method methode, Object[] params) throws RemoteException {
		this.instance = instance;
		this.methode = methode;
		this.params = params;
		this.methode.setAccessible(true);
	}
	
	/* (non-Javadoc)
	 * @see dico.observer.Subscriber#update(java.lang.Object, java.lang.Object)
	 */
	public void update(Object pub, Object code) throws RemoteException {
		// TODO Auto-generated method stub
		try{
			methode.invoke(instance, params);
		}
		catch(Exception e){
			
		}
	}
}

Conclusion

Enjoy it :D
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de akandras le 03/02/2006 13:32:05

Nikel Le code qu'il me faut !!

Juste un petit reproche, les commentaires !!!!!!!!
J'aurai voulu des petites précisions sur la correspondance avec les classes observer/Observable, un petit résumé de chaque classe, ...

Enfin des commentaires qui aurait évité de reprendre à zéro ton code et d'imaginer un exemple tout bete d'utilisation basic d'un modele MVC avec RMI.

D'ailleurs j'ai toujours pas fini de comprendre ton code...

signaler à un administrateur
Commentaire de akandras le 03/02/2006 23:37:19

Pour plus d'informations sur les classes publisher/subscriber

allez voir là : http://jdj.sys-con.com/read/35878.htm

C'est en anglais, mais le vocabulaire est pas compliqué

bonne lecture.

signaler à un administrateur
Commentaire de indiana_jules le 17/02/2006 12:41:58

j'en suis desole, j'avais fait ca rapidement lors d'un weekend afin de trouver une solution pratique pour un projet, je n'avais donc pas mis les commentaires.
Grosso modo le Subscriber est l'observer et le Publisher l'observable.
Le Publishing sert de gestion des Subscriber qui sont sur les clients (le publishing se situe dans le serveur)

voilà

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

RMI [ par Aldee ] Quelle configuration minimum me faut-il pour tester une liaison RMI? Un/Deux ordinateur "basique" avec Java, deux cartes reseaux et une ficelle entre? java rmi [ par scorpionetoile ] salut a toutje veus tester un petit exemple en java utilisant rmi,je l'ai execute sur mon poste mais le problemec'est que je veus l'executer sur 2 pos RMI REGISTRY [ par efr ] efrEst il possible de m'expliquer comment fonctionne la méthode Http Post avec RMI pour eviter les firewalls envoyer un fichier en RMI [ par lutecefalco ] Salut à tous,j'ai à disposition un serveur avec le logiciel R d'installé dessus.A partir de mon PC, je génère un script et je dois l'envoyer en RMI su Communication RMI [ par homersimp ] J'aimerai relié une applet et une servlet. Mais comme la communication RMI ne marche pas toujours, je voudrais que l'applet essaie d'abord de ce conn Rmi et Jnlp [ par homersimp ] Mon but est de réaliser une applet dans un fichier jnlp, qui devrait se connecter à une servlet sur serveur(avec exemple de DaytimeServer et applet.Si RMI et Visual J++ [ par egamir ] J'ai développé une classe java "client.java" avec la SDK de sun (qui s'exécute parfaitement avec la jvm de sun).Cette classe importe le package java.r RMI et Visual J++ [ par egamir ] J'ai développé une classe java "client.java" avec la SDK de sun (qui s'exécute parfaitement avec la jvm de sun).Cette classe importe le package java.r Problème JAVA RMI Hello World [ par missgaelle ] Bonsoir à tous,Voilà, je viens de créer un hello world en JAVA avec rmi...ah oui, détail importante, je ne suis qu'un mini débutante en prog, on me de RMI => Problemes d'IPs [ par Bulzebok ] J'ai chez moi 2 PC, l'un et mon PC usuel et l'autre et simplement une passerel pour allez sur le NET et qui tourne en permanence et ki soulage le prem


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,702 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.