Observer et observable en rmi

Soyez le premier à donner votre avis sur cette source.

Vue 13 417 fois - Téléchargée 1 243 fois

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 / Exemple :


/*

  • 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

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

arafat877
Messages postés
13
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
22 décembre 2010

salut !

Je veux adapter ton code pour mon projet.

Il s'agit d'une application client/serveur qui est basé sur Spring RMI, le client contient une JTable, je veux lors ce que un utilisateur A apporte des changements à la table par le bais d'un formulaire, les autres doivent voire les dits changements, sans cliquer sur un bouton par exemple.

et comme tu le sais, en Spring RMI, on n'ai pas amener à dériver les classes Remote, ni UnicastRemoteObject.

il faut juste déclarer une interface, et une classe qui va l'implémenter, puis donner la main à Spring afin qu'il publie le service, et de l'autre côté il faut déclarer la même interface et une classe l'implémentant, puis donner la main à Spring afin d’établir la connexion avec le serveur.

prière de bien vouloir lire ces articles :
http://static.springsource.org/spring/docs/2.0.x/reference/remoting.html
http://cosminaru.ro/blog/2006/11/02/spring-by-examples-rmi/

Ma question comment adapter ta solution, pour Spring ?

Cordialement
titoss87
Messages postés
1
Date d'inscription
vendredi 14 août 2009
Statut
Membre
Dernière intervention
18 août 2010

MERCI POUR Le code source c intéressant , mais est ce que vous pouver nous indiquer comment exécuter ce code (le main)
indiana_jules
Messages postés
750
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
23 décembre 2008
18
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à
akandras
Messages postés
5
Date d'inscription
lundi 10 novembre 2003
Statut
Membre
Dernière intervention
3 février 2006

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.
akandras
Messages postés
5
Date d'inscription
lundi 10 novembre 2003
Statut
Membre
Dernière intervention
3 février 2006

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...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.