AMETAS.servicedev
Class AMETASAsyncServiceProxy

java.lang.Object
  extended byAMETAS.event.AMETASEventHandler
      extended byAMETAS.servicedev.AMETASServiceProxy
          extended byAMETAS.servicedev.AMETASAsyncServiceProxy
All Implemented Interfaces:
AMETASEventHandlerIf, java.io.Serializable

public abstract class AMETASAsyncServiceProxy
extends AMETASServiceProxy

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.

Since:
Version 2.1.0
See Also:
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

AMETASAsyncServiceProxy

public AMETASAsyncServiceProxy(AMETASPlaceUser puClient,
                               AMETASPlaceUserDriverIf drvClientDriver)
Konstruktor.

Parameters:
puClient - Das Stellennutzerobjekt des Klienten, zu übergeben als this
drvClientDriver - Der Treiber des Klienten
Method Detail

registerResponseHandler

protected void registerResponseHandler(AMETASMessageID mid,
                                       AMETASResponseHandler rhnd)
Legt den AMETASResponseHandler unter der Nachrichten-ID als Schlüssel in der internen Handler-Tabelle ab.

Parameters:
mid - Die ID der Anfragenachricht
rhnd - Der AMETASResponseHandler

findHandler

protected AMETASResponseHandler findHandler(AMETASMessageID midSearched)
Sucht den AMETASResponseHandler zu der übergebenen Nachrichten-ID.

Parameters:
midSearched - Die NachrichtenID des gesuchten Eintrages
Returns:
Den AMETASResponseHandler, wenn gefunden, null sonst.

dispatchResponse

protected abstract void dispatchResponse(AMETASResponseHandler rhnd)
Diese Methode muß implementiert werden, um die Antwortnachrichten des Dienstes in die passenden 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.

Parameters:
rhnd - Der AMETASResponseHandler, für dessen Anfrage eine Antwort eingetroffen ist. In diesen Handler müssen die Daten der Antwort entsprechend eingefügt werden.

depositAsyncRequest

protected AMETASMessage depositAsyncRequest(AMETASResponseHandler rhnd,
                                            java.lang.Object[] aobjParams)
Legt eine Anfragenachricht ab. Die Nachricht wird mit Standardparametern ausgestattet, und erhält als Nutzlast das übergebene Array der Anfrageparameter.

Parameters:
rhnd - Der AMETASResponseHandler, der mit der gesendeten Nachricht verknüpft werden soll und später die Antwortdaten erhalten wird.
aobjParams - Die Nutzlast der Anfragenachricht.
Returns:
Die erzeugte Nachricht. Abgeleitete Klassen können so noch Informationen aus dieser Nachricht ziehen.

handleServiceMessage

public boolean handleServiceMessage(java.lang.String sTypeSpec,
                                    java.lang.Object[] aobjBody,
                                    AMETASMessage mes)
Empfängt und bearbeitet die Antworten des Dienstes. Von hier aus wird dispatchResponse() aufgerufen. Die Antwortnachricht wird in m_mesResponse abgelegt, die Typspezifikation in m_sResponseTypeSpec und die Nutzlast in m_aobjResponseBody.

Specified by:
handleServiceMessage in interface AMETASEventHandlerIf
Overrides:
handleServiceMessage in class AMETASEventHandler
Parameters:
sTypeSpec - Die Typspezifikation der Antwortnachricht
aobjBody - Die Nutzlast der Antwortnachricht
mes - Die Antwortnachricht selbst
Returns:
true, falls die eingehende Nachricht von dieser Methode verarbeitet wurde, false sonst
See Also:
AMETASMessage