|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.ObjectAMETAS.event.AMETASEventHandler
AMETAS.servicedev.AMETASServiceProxy
AMETAS.servicedev.AMETASAsyncServiceProxy
Diese Klasse stellt einen asynchronen Proxy für Dienstaufrufe zur
Verfügung. Während der AMETASSyncServiceProxy einen
klassischen Proxy darstellt, wie er in vielen RPC-Systemen zu
finden ist, stellt der AMETASAsyncServiceProxy die
Bequemlichkeit eines Methodenaufrufs bereit, ohne jedoch eine
Synchronität zu erzwingen. Die Komplexität von AMETAS-Nachrichten
wird hinter einem Methodenaufruf verborgen, der aber direkt nach
dem Ablegen der Anfragenachricht zurückkehrt und nicht wie der
AMETASSyncServiceProxy auf eine Antwort wartet. Dies
sollte vor allem bei langwierigen Dienstaufrufen eingesetzt
werden, die den Klienten über eine lange Zeit blockieren würden.
Da das Ergebnis eines Aufrufen nicht direkt zurückgeliefert werden
kann, muß eine andere Art der Rückgabe gewählt werden. Hierbei
verwendet der AMETASAsyncServiceProxy einen einfachen
Callback-Mechanismus. Bei jedem Methodenaufruf muß der Klient
neben den Aufrufparametern einen
AMETASResponseHandler mit übergeben. Der Proxy
speichert diesen unter der ID der Anfragenachricht ab, bis nach
einiger Zeit die Antwort des Dienstes (hoffentlich) ankommt. Dann
sucht der Proxy das passende Handler-Objekt, legt die Daten der
Antwort in diesem ab und löscht es aus seinem Speicherbereich. Der
Klient hält jedoch immer noch eine Referenz darauf und schaut hin
und wieder nach, ob schon Daten in dem ResponseHandler
liegen. Daneben kann er aber auch andere Dinge tun. Es ist zu
beachten, daß der asynchrone Proxy kein Timeout auf abgesetzten
Anfragenachrichten durchsetzt. D.h. Der Klient muß selber
beurteilen, ob die Antwort auf eine Anfrage noch eintrifft, oder
ob die Anfrage als gescheitert gewertet wird.
Der Implementierer eines AMETASAsyncServiceProxy hat
im wesentlichen dieselben Aufagen, wie der Implementierer eines
AMETASSyncServiceProxy. Letzterer erledigt das
Marshalling der Anfrage und das Unmarshalling der Antwort in
derselben Methode. Dies ist die Methode, die den Dienstaufruf
gegenüber dem Klienten kapselt und transparent macht. Zwischen
Marshalling und Unmarshalling wird in dieser Methode gewartet und
dann wird die Antwort überprüft. Diesen Vorteil der Lokalität von
Marshalling und Unmarshalling genießt der Implementierer eines
AMETASAsyncServiceProxy nicht. Seine Dienstmethoden
kehren gleich nach dem Absenden der Anfragenachricht zurück. Es
bleibt das Problem des Unmarshalling. Daher muß er neben den
Dienstmethoden eine weitere Methode implementieren, die dies
übernimmt. Dies ist
dispatchResponse(AMETASResponseHandler). Diese
Methode wird aufgerufen wenn eine Antwort eintrifft. Vorher wird
vom Proxy der richtige AMETASResponseHandler
herausgesucht und der Methode übergeben. Der Nutzlastvektor der
Antwort liegt in m_vctResponseBody. Die Aufgabe des
Implementierers ist nun, in dieser Methode eine Fallunterschiedung
zwischen den möglichen Antwortnachrichten anhand ihrer
Typspezifikation (erstes Element von
m_vctResponseBody) zu machen und die Antwort geeignet
in ein Rückgabeobjekt zu packen, das er dem
AMETASResponseHandler über
setResponse(Object) übergibt. Der Klient wird so von
der Aufgabe des Unmarshalling entbunden und hat wenigstens
teilweise die Abstraktion eines Methodenaufrufes mit
Rückgabewert.
AMETASResponseHandler,
Serialized Form| Field Summary |
| Fields inherited from class AMETAS.servicedev.AMETASServiceProxy |
m_aobjResponseBody, m_drvClientDriver, m_idService, m_mesResponse, m_puClient, m_puidClientID, m_sResponseTypeSpec, m_sServiceName, NO_SERVICE_NAME, OK, SERVICE_NOT_FOUND |
| Constructor Summary | |
AMETASAsyncServiceProxy(AMETASPlaceUser puClient,
AMETASPlaceUserDriverIf drvClientDriver)
Konstruktor. |
|
| Method Summary | |
protected AMETASMessage |
depositAsyncRequest(AMETASResponseHandler rhnd,
java.lang.Object[] aobjParams)
Legt eine Anfragenachricht ab. |
protected abstract void |
dispatchResponse(AMETASResponseHandler rhnd)
Diese Methode muß implementiert werden, um die Antwortnachrichten des Dienstes in die passenden AMETASResponseHandler zu verteilen. |
protected AMETASResponseHandler |
findHandler(AMETASMessageID midSearched)
Sucht den AMETASResponseHandler zu der
übergebenen Nachrichten-ID. |
boolean |
handleServiceMessage(java.lang.String sTypeSpec,
java.lang.Object[] aobjBody,
AMETASMessage mes)
Empfängt und bearbeitet die Antworten des Dienstes. |
protected void |
registerResponseHandler(AMETASMessageID mid,
AMETASResponseHandler rhnd)
Legt den AMETASResponseHandler unter der
Nachrichten-ID als Schlüssel in der internen Handler-Tabelle
ab. |
| Methods inherited from class AMETAS.servicedev.AMETASServiceProxy |
cleanup, depositRequest, getServiceID, getServiceName, init, init, output, setServiceName |
| Methods inherited from class AMETAS.event.AMETASEventHandler |
handleApplicationMessage, handleCustomMessage, handleMessageEvent, handleMessageMessage, handlePlaceEvent, handlePlaceMessage, handlePlaceUserEvent, handleSecurityMessage, handleTradingMessage |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
public AMETASAsyncServiceProxy(AMETASPlaceUser puClient,
AMETASPlaceUserDriverIf drvClientDriver)
puClient - Das Stellennutzerobjekt des Klienten, zu
übergeben als thisdrvClientDriver - Der Treiber des Klienten| Method Detail |
protected void registerResponseHandler(AMETASMessageID mid,
AMETASResponseHandler rhnd)
AMETASResponseHandler unter der
Nachrichten-ID als Schlüssel in der internen Handler-Tabelle
ab.
mid - Die ID der Anfragenachrichtrhnd - Der AMETASResponseHandlerprotected AMETASResponseHandler findHandler(AMETASMessageID midSearched)
AMETASResponseHandler zu der
übergebenen Nachrichten-ID.
midSearched - Die NachrichtenID des gesuchten Eintrages
AMETASResponseHandler, wenn gefunden,
null sonst.protected abstract void dispatchResponse(AMETASResponseHandler rhnd)
AMETASResponseHandler zu verteilen. Bemerkung
: In dieser Methode kann (muß) der Implementierer des
Proxies auf die Member-Variablen
m_vctResponseBody,
m_sResponseTypeSpec und
m_mesResponse zugreifen, um die Daten der Antwort
auszuwerten. Diese Variablen werden in
handleServiceMessage nach dem Empfang einer
Antwort gefüllt.
rhnd - Der AMETASResponseHandler, für dessen
Anfrage eine Antwort eingetroffen ist. In diesen Handler
müssen die Daten der Antwort entsprechend eingefügt werden.
protected AMETASMessage depositAsyncRequest(AMETASResponseHandler rhnd,
java.lang.Object[] aobjParams)
rhnd - Der AMETASResponseHandler, der mit
der gesendeten Nachricht verknüpft werden soll und später die
Antwortdaten erhalten wird.aobjParams - Die Nutzlast der Anfragenachricht.
public boolean handleServiceMessage(java.lang.String sTypeSpec,
java.lang.Object[] aobjBody,
AMETASMessage mes)
dispatchResponse() aufgerufen. Die
Antwortnachricht wird in m_mesResponse abgelegt,
die Typspezifikation in m_sResponseTypeSpec und
die Nutzlast in m_aobjResponseBody.
handleServiceMessage in interface AMETASEventHandlerIfhandleServiceMessage in class AMETASEventHandlersTypeSpec - Die Typspezifikation der AntwortnachrichtaobjBody - Die Nutzlast der Antwortnachrichtmes - Die Antwortnachricht selbst
true, falls die eingehende Nachricht von
dieser Methode verarbeitet wurde, false sonstAMETASMessage
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||