Roblet®-Development-Kit
1.2 (22Jul10)
API für Anwendungen

genRob.genControl.client
Interface Server


public interface Server

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.

See Also:
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

run

public Object run(Roblet roblet)
           throws InterruptedException,
                  ClientException,
                  Exception
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.

Platziert ein Roblet® auf diesem Roblet®-Server, der es dann laufen läßt.  Diese Aktion ist mit Netzwerkaktivität verbunden und kann daher unbestimmte Zeit in Anspruch nehmen.

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 Threads benutzt.  Ist auch dieser null, so wird der System-Klassenlader (ClassLoader.getSystemClassLoader()) eingesetzt.

Parameters:
roblet - Roblet®, welches auf dem Server zum Laufen gebracht wird
Returns:
Resultat, welches vom Roblet® kommt
Throws:
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 auftrat

getSlot

public Slot getSlot()
             throws InterruptedException,
                    ClientException
Gibt ein neues Fach zurück.  Diese Aktion ist mit Netzwerkaktivität verbunden und kann daher unbestimmte Zeit in Anspruch nehmen.  Es wird also nicht mit einem timeout gearbeitet, jedoch der Thread, der diese Methode aufruft, kann jederzeit unterbrochen werden.

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.

Returns:
neues Fach des Servers
Throws:
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 auftraten

getIdentity

public Identity getIdentity()
Gibt eine (aktuelle) Identität des Servers zurück.

Returns:
Eine (aktuell) Identität des Servers

Roblet®-Development-Kit
1.2 (22Jul10)
API für Anwendungen

Copyright © 2001-2010, roblet®.org, Hagen Stanek, http://roblet.org/rdk