AMETAS.servicedev
Class AMETASResponseHandler

java.lang.Object
  extended byAMETAS.servicedev.AMETASResponseHandler

public class AMETASResponseHandler
extends java.lang.Object

Diese Klasse dient dem Datenaustausch zwischen einem Klienten (Stellennutzer) und einem AMETASAsyncServiceProxy. Der Klient übergibt beim Aufruf einer Dienstmethode im Proxy einen AMETASResponseHandler, der als Callback-Objekt dient. Die Dienstmethode kehrt sofort zurück, so daß der Klient nicht blockiert wird und andere Dinge tun kann, während der Dienst seine Anfrage bearbeitet. Der Klient überprüft dabei von Zeit zu Zeit, ob der Dienst bereits geantwortet hat, indem er die Methode getResponse() auf dem entsprechenden ResponseHandler aufruft. Bekommt er dabei ein Antwortobjekt zurück, so kann er es bearbeiten. Dieses Objekt enthält das Ergebnis des Dienstaufrufs. Liefert getResponse() null zurück, so hat der Dienst noch nicht geantwortet und der Klient kann sich weiter mit anderen Dingen beschäftigen.

Der Proxy merkt sich bei einem Aufruf vom Klienten das übergebene AMETASResponseHandler-Objekt und läßt die aufgerufene Methode zurückkehren, so das der Klient deblockiert wird. Triff eine Antwort des Dienstes ein, so übergibt der Proxy die enthaltenen Daten über setResponse(Object) dem ResponseHandler und löscht seine Referenz auf den Handler. Für ihn ist der Dienstaufruf damit erledigt. Das Handlerobjekt entkoppelt also Kleint und Proxy.

Wichtig ist hierbei, daß für jeden Aufruf ein anderes Handlerobjekt zuständig ist. D.h. der Klient erstellt für jeden Aufruf einen Handler und übergibt ihn an den Proxy. Gleichzeitig hält er eine Referenz auf den Handler, um die Antwort abholen zu können. Es sollte auch möglich sein, ResponseHandler wiederzuverwenden. Allerdings muß dann darauf geachtet werden, daß nicht der Handler eines noch aktiven Aufrufes verwendet wird; denn wenn ein Handler gleichzeitig zweimal beim Proxy registriert wird, dann kann es zu Datenverlust kommen, wenn die zuerst eingetroffene Antwort von der zweiten überschrieben wird. Der Einsatz eines AMETASAsyncServiceProxy und eines AMETASResponseHandlers könnte etwa wie folgt aussehen:

    ...
    // Erstelle einen Handler speziell für den folgenden Aufruf.
    AMETASResponseHandler rhGetLoadHandler = new AMETASResponseHandler();
    // Die Dienstanfrage über den Proxy im Klientenobjekt.
    m_proxy.getCounter("Load", rhGetLoadHandler);

    while( bBlabla ) {
       ... Hier können irgendwelche Aktionen ausgeführt werden. ...
       // Die Dienstmethode liefert ein Objekt von Typ Counter zurück. 
           // Schaue nach, ob es schon eingetroffen ist.
       Counter cnt = (Counter)rhGetLoadHandler.getResponse();
       if( cnt != null ) {
           // Die Antwort ist eingetroffen. Bearbeite sie.
               if( rhGetLoadHandler.getAge() > 10000 ) // Antwort ist älter als 10 Sekunden
                   m_Driver.output("Uiuiui, die Antwort ist aber ganz schön alt. Vergessen Wir sie lieber");
               else {
                   ... Hier wird der erhaltene Zähler bearbeitet. ...
               }
       }
    }
    

Since:
Version 2.1.0

Field Summary
static int NO_EXCEPTION
          Exception-Konstante für den internen Gebrauch.
static int PARAM_MISMATCH_EXCEPTION
          Exception-Konstante für den internen Gebrauch.
static int SERVICE_ERROR_EXCEPTION
          Exception-Konstante für den internen Gebrauch.
 
Constructor Summary
AMETASResponseHandler()
           
 
Method Summary
 long getAge()
          Liefert das Alter der Antwort im Millisekunden zurück.
 java.lang.Object getResponse()
          Wird vom Klienten aufgerufen, um zu testen, ob die Antwort bereits aingetroffen ist.
 long getTimeStamp()
          Liefert den Zeitpunkt zurück, an dem der Proxy die Antwortdaten hier abgelegt hat.
 void setException(int nException, java.lang.String sMessage)
          Wird vom Proxy aufgerufen, um eine durch nException beschriebene Exception zu werfen, wenn der Klient getResponse aufruft.
 void setResponse(java.lang.Object objResponseData)
          Wird vom Proxy aufgerufen, sobald die Antwort des Dienstes eintrifft.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

NO_EXCEPTION

public static final int NO_EXCEPTION
Exception-Konstante für den internen Gebrauch.

See Also:
Constant Field Values

PARAM_MISMATCH_EXCEPTION

public static final int PARAM_MISMATCH_EXCEPTION
Exception-Konstante für den internen Gebrauch.

See Also:
Constant Field Values

SERVICE_ERROR_EXCEPTION

public static final int SERVICE_ERROR_EXCEPTION
Exception-Konstante für den internen Gebrauch.

See Also:
Constant Field Values
Constructor Detail

AMETASResponseHandler

public AMETASResponseHandler()
Method Detail

getResponse

public java.lang.Object getResponse()
                             throws ProxyParamMismatchException,
                                    ProxyServiceErrorException
Wird vom Klienten aufgerufen, um zu testen, ob die Antwort bereits aingetroffen ist. Falls ja, wird das Ergebnisobjekt zurückgeliefert. Falls nein, wird null zurückgeliefert.

Returns:
Das Ergebnisobjekt falls eingetroffen, null sonst
Throws:
ProxyParamMismatchException - falls der Proxy die Antwort aufgrund fehlerhafter Antwortparameter nicht auswerten konnte. Was in diesem Zusammenhang fehlerhaft bedeutet, hängt von Dienst und Proxy ab.
ProxyServiceErrorException - falls im Dienst bei der Bearbeitung der Anfrage ein Fehler aufgetreten ist.

setResponse

public void setResponse(java.lang.Object objResponseData)
Wird vom Proxy aufgerufen, sobald die Antwort des Dienstes eintrifft. Hier übergibt der Proxy die erhaltenen Antwortdaten dem Handler.

Parameters:
objResponseData - Ein Objekt, das die Antwortdaten des Dienstes enthält. Welchen Typ dieses Objekt hat, häng vom Proxy ab.

setException

public void setException(int nException,
                         java.lang.String sMessage)
Wird vom Proxy aufgerufen, um eine durch nException beschriebene Exception zu werfen, wenn der Klient getResponse aufruft. Mit diesem Mechanismus der verzögerten Ausnahmen wird eine Fehlerbehandlung möglich, wie sie auch im synchronen Fall vorgenommen wird. nException muß eine der in dieser Klasse definierten Konstanten PARAM_MISMATCH_EXCEPTION oder SERVICE_ERROR_EXCEPTION sein. Wird durch den Proxy kein Wert übergeben, dann enthält m_nException standaradmäßig NO_EXCEPTION.

Parameters:
nException - Eine der in dieser Klasse definierten EXCEPTION-Konstanten.
sMessage - Eine Textnachricht, die der Exception im Konstruktor übergeben wird

getTimeStamp

public long getTimeStamp()
Liefert den Zeitpunkt zurück, an dem der Proxy die Antwortdaten hier abgelegt hat.

Returns:
Zeitstempel der Antwort-Ankunftszeit in Millisekunden

getAge

public long getAge()
Liefert das Alter der Antwort im Millisekunden zurück.

Returns:
Das Alter der Antwort in Millisekunden.