|
Roblet®-Development-Kit 1.2 (22Jul10) API für Anwendungen |
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
Jede Instanz repräsentiert genau einen Roblet®-Server und ein Roblet®-Server wird pro Klient durch genaue eine solche Instanz repräsentiert (Server-Repräsentanz).
M.a.W.: Ein Roblet®-Server ist ein fernes System, zu welchem eine Instanz von diesem Typ eine Referenz darstellt. Diese Instanz wirkt demnach als lokale Repräsentanz des fernen Roblet®-Server.
Ein Roblet®-Server stellt Fächer (Slot
) für Roblets® bereit.
Über getSlot()
kann man solche bekommen.
In jedem Fach kann zu jedem Zeitpunkt nur ein Roblet® laufen, aber eine Anwendung kann sich (fast) beliebig viele Fächer besorgen.
Client
,
Slot
Method Summary | |
Identity |
getIdentity()
Gibt eine (aktuelle) Identität des Servers zurück. |
Slot |
getSlot()
Gibt ein neues Fach zurück. |
Object |
run(Roblet roblet)
Deprecated. Zu ersetzen durch eine Kombination von getSlot() und Slot.run(Roblet) .
Diese scheinbar einfache Methode ist zwar für Einsteiger
gut, hat aber in der Praxis oft den Blick für ein tieferes
Verständnis der Roblet®-Technik versperrt. |
Method Detail |
public Object run(Roblet roblet) throws InterruptedException, ClientException, Exception
getSlot()
und Slot.run(Roblet)
.
Diese scheinbar einfache Methode ist zwar für Einsteiger
gut, hat aber in der Praxis oft den Blick für ein tieferes
Verständnis der Roblet®-Technik versperrt.
Zur Ausführung wird ein neues Fach auf dem Server eingerichtet
und das Roblet® kommt darin zum Laufen
- dessen Ausführung
beendet also keine Roblets® aus früheren Aufrufen
dieser Methode (anders als bei Slot.run(Roblet)
).
Das Roblet® wird für den Transport serialisiert
und zum Server geschickt.
Aus diesem Grund muß das Roblet den Typ
Serializable
implementierten.
Wird statt eines Roblets® null übergeben,
so wird auch null zurückgegeben.
Es wird kein Roblet beendet, da sowieso ein neues Fach
für null benutzt würde (anders als bei Slot.run(Roblet)
).
Ist das Roblet® nicht null, so wird vom
Roblet®-Server dessen Methode
Roblet.execute(org.roblet.Robot)
ausgeführt.
Nach deren Ende wird ihr Rückgabewert hier zurückgegeben.
Es wird kein Roblet beendet, da sowieso ein neues Fach
für null benutzt würde (anders als bei Slot.run(Roblet)
).
Wird im Hauptthread, welcher Roblet.execute(org.roblet.Robot)
ausführt, eine Ausnahme abgeleitet von Exception
geworfen, so wird sie an dieser Stelle auch geworfen.
Schließt man diese Methode demnach in einen
try-Block ein, so kann man im catch-Block
direkt die selbst erzeugten Ausnahmen abfangen.
Wurde eine Ausnahme, abgeleitet von Exception
,
in einem beliebigen anderen Thread des Roblets® erzeugt
(und nicht abgefangen) während der Hauptthread
des Roblets® noch lief, so wird diese entsprechend hier geworfen
(während das Roblet® bereits vom Server beendet wurde).
Entsteht im Hauptthread oder einem beliebigen anderen eine
Ausnahme, welche nicht von Exception
abgeleitet ist,
so wird der Server nach Möglichkeit trotzdem Informationen
schicken, die vom Roblet®-Klienten dann jedoch
in eine ClientException
gepackt werden.
Sollte die Verbindung unbrauchbar werden, so wird
eine ClientException
geworfen.
Es bleibt in diesem Fall offen, ob das Roblet® erfolgreich ankam und
lief oder nicht.
Ein erneuter Aufruf der Methode baut eine neue Verbindung auf
und hat keinen Bezug zu vorhergehenden Aufrufen.
Wird der diese Methode aufrufende Thread unterbrochen,
so wird entweder eine Ausnahme vom Typ InterruptedException
geworfen oder das Unterbrechungssignal (interrupt flag)
des Threads gesetzt.
Ersteres wird gemacht, wenn die Netzwerkaktivität noch nicht oder
gerade ausgelöst wurde.
Letzteres geschieht, wenn die Aktivität bereits abgeschlossen
ist.
Im letzteren Fall sind die Ergebnisse zwar normal verwendbar, aber
es ist auch zu beachten, daß der Thread natürlich beim nächsten
Object.wait()
, Thread.sleep(long)
o.ä. eine Ausnahme
obigen Typs erzeugen wird.
Mehrmalige Aufrufe dieser Methode mit den gleichen Parametern sprechen immer den gleichen Server an, da nach jedem Verbindungsneuaufbau eine Identitätsprüfung erfolgt.
Anfragen nach Klassen und Ressourcen für bzw. durch das Roblet®
werden über den bei Aufruf dieser Methode gesetzten
Kontext-Klassenladers (Thread.getContextClassLoader()
)
befriedigt.
Ist keiner gesetzt, so wird der Klassenlader der Klasse des Roblets®
verwendet.
Ist dieser null, so wird der der Klasse des diese Methode
aufrufenden Thread
s benutzt.
Ist auch dieser null, so wird der System-Klassenlader
(ClassLoader.getSystemClassLoader()
) eingesetzt.
roblet
- Roblet®, welches auf dem Server zum Laufen
gebracht wird
ClientException
- falls die Verbindung nicht funktioniert
oder sonstige Probleme auftraten
- verkettet ist die Ursache
InterruptedException
- falls der aufrufende Thread
beim Warten auf das Resultat durch die Anwendung
zum Unterbrechen aufgefordert wird oder bereits
vorher sein Unterbrechungssignal (interrupt flag)
gesetzt war
Exception
- falls im Roblet® ein Fehler auftratpublic Slot getSlot() throws InterruptedException, ClientException
Eine Anwendung kann (fast) beliebig viele Fächer gleichzeitig auf einem Server nutzen, in denen auch parallel Roblets® laufen können. Jedes Fach reserviert allerdings einige Ressourcen, weshalb Server-seitig Einschränkungen vorliegen können.
InterruptedException
- falls der aufrufende Thread
beim Warten auf das Fach durch die Anwendung
zum Unterbrechen aufgefordert wird oder bereits
vorher sein Unterbrechungssignal (interrupt flag)
gesetzt war
ClientException
- falls sonstige Probleme auftratenpublic Identity getIdentity()
|
Roblet®-Development-Kit 1.2 (22Jul10) API für Anwendungen |
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |