Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
der Observer muss auch ein UnicastRemoteObject sein (siehe RemoteObserverImpl unten).
RemoteObserverImpl im Beispiel unten delegiert dann den Aufruf zum eigentlichen
RemoteObserver (Client). Vielleicht ist der Name der Klasse etwas unglücklich gewählt,
mir fällt aber kein besserer ein. :wink:
Etwas "uncool" ist auch, dass der Client, also der eigentliche Observer, indirekt java.rmi.Remote
implementiert. Ein zusätzliches Interface für die Delegation (in RemoteObserverImpl) wäre vielleicht
besser. ???:L
Es scheint zu funktionieren. Falls jemand eine bessere Alternative kennt, dann bitte
melden. Ich lerne gerne dazu.
Gruß,
Michael
Code:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RemoteObserver extends Remote
{
public void update(RemoteObservable observable, Object obj) throws RemoteException;
}
Code:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class RemoteObserverImpl extends UnicastRemoteObject implements RemoteObserver
{
private static final long serialVersionUID = 3878538909769626282L;
private transient RemoteObserver observer;
public RemoteObserverImpl(RemoteObserver observer) throws RemoteException
{
this.observer = observer;
}
public void update(RemoteObservable observable, Object obj) throws RemoteException
{
observer.update(observable, obj);
}
}
Code:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RemoteObservable extends Remote
{
public void addObserver(RemoteObserver observer) throws RemoteException;
public void removeObserver(RemoteObserver observer) throws RemoteException;
}
Bei dem Beispiel von meiner letzten Antwort werden die Stubs automatisch generiert.
Du brauchst rmic nicht mehr aufzurufen. Die Voraussetzung ist einfach nur, dass das
Callback auch ein UnicastRemoteObject ist. Die Proxies und Stubs werden automatisch
generiert, da brauchst clientseitig nichts mehr zu tun.
Du kannst es Dir anschauen, wenn Du folgendes in die Methode ServerImpl#addObserver(...)
einfügst.
Wenn man (bei einem Remote-Objekt oder bei einem serialisierten Objekt) der statischen Kalssen-Variable serialVersionUID keinen Wert zuweist, dann gibt der compiler eine Warnung. Ohne diese Variable läuft der Code auch problemlos. Wozu braucht man diese Variable und wie bestimmt man den Wert?
ein Nachteil von Oberver/Observable-Patterns ist, meiner Meinung nach, dass es unklar ist, welcher Observer zuerst benachrichtigt wird. Die Methode addObserver könnte z.B. um einen zusätzlichen Argument erweitert werden, damit die Prioritäten der Observers festgelegt werden können.
Code:
public void addObserver(RemoteObserver observer, int priority)
Wenn man (bei einem Remote-Objekt oder bei einem serialisierten Objekt) der statischen Kalssen-Variable serialVersionUID keinen Wert zuweist, dann gibt der compiler eine Warnung. Ohne diese Variable läuft der Code auch problemlos. Wozu braucht man diese Variable und wie bestimmt man den Wert?
Lese bitte die Beschreibung zu java.io.Serializable.
If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members
serialVersionUID kannst du mit dem Programm "serialver" (bei jdk dabei) generieren lassen.
Compiliere zuerst die serialisierbare Klasse, dann rufe "serialver Klassenname" auf.
Die Zeile kopierst du, fügst sie in den Code ein und compilierst das Zeug noch mal.
Das brauchst du nur einmal zu tun.
Anonymous hat gesagt.:
Funktioniert das letzte Beispiel auch mit JRE 1.3 ?
Jajn. Du müsstest den ganzen JDK 1.5 Code entfernen/umschreiben und die Stubs mit "rmic" (siehe java\bin Verzeichnis) generieren.
@Zebani
Wenn es unbedingt benötigt wird. Für kleine Sachen ist das Observer-Pattern aber nicht schlecht.
Ich würde eher auf JMS zurückgreifen, statt solche RMI Akrobatik zu veranstalten, aber mich fragt
keiner. :wink: