!--a11y-->
Acknowledgments 
Mit Acknowledgments können Sie sich den Empfang von asynchronen Messages bestätigen lassen. Sie müssen Acknowledgments explizit im Anwendungsprogramm anfordern und können spezifizieren, welche Art der Rückmeldung sie erhalten möchten:
· Positive oder negative Acknowledgments
· System-Acknowledgments, über die die Laufzeitumgebung bestätigt, dass eine asynchrone Message den Empfänger erreicht hat.
· Anwendungs-Acknowledgments, mit denen die erfolgreiche Verarbeitung der asynchronen Message beim Empfänger bestätigt wird.
Im Anwendungsprogramm können Sie den Status eines angeforderten Acknowledgments abfragen und auswerten.
Folgende Empfänger unterstützen Acknowledgments:
· ABAP und Java-Proxies (letztere zu XI 3.0 SP1)
· Integrationsprozesse
· IDocs, wobei diese nur dann Acknowledgments zurückgeben, wenn diese über das ALE audit konfiguriert wurden
· Empfänger-Adapter unterstützen System-Acknowledgments, aber keine Anwendungs-Acknowledgments.
Um ein oder mehrere Acknowledgments anzufordern, verwenden Sie die folgenden Methoden des MessageSpecifier-Interface:
Methoden zur Acknowledgement-Anforderung
Feld |
Angefordertes Acknowledgment |
public void
setSystemAckRequested |
Positives System-Acknowledgment Der Empfänger wurde erfolgreich erreicht; für Server-Proxies bedeutet dies, dass die implementierende Klasse zum Server-Proxy gefunden wurde und die Methode zur Inbound-Verarbeitung aufgerufen werden konnte. |
public void setSystemErrorAckRequested (String ackListenerName); |
Negatives System-Acknowledgment Die Laufzeit der Exchange Infrastructure meldet einen Fehler während der Übertragung beziehungsweise der Verarbeitung der Message auf dem Weg zum Empfänger. Beispielsweise kann ein Fehler in einem Mapping-Programm oder ein nicht im Empfängersystem vorhandenes Server-Proxy dieses Acknowledgment auslösen. |
public void setApplicationAckRequested (String ackListenerName); |
Positives Anwendungs-Acknowledgment Die Message wurde vom Empfänger erfolgreich verarbeitet. |
public void setApplicationErrorAckRequested (String ackListenerName); |
Negatives Anwendungs-Acknowledgment Während der Verarbeitung der Message beim Empfänger ist ein Fehler aufgetreten. |

Wann eine Message von einem Empfänger erfolgreich
verarbeitet worden ist, hängt vom Empfänger ab: Bei einem Server-Proxy ist
dies der Fall, wenn die beim Empfänger ausgeführte Methode keine Ausnahme
ausgelöst hat, bei einem Integrationsprozess können Sie im Sendeschritt
explizit ein Acknowledgment versenden (siehe Abschnitt Acknowledgment senden unter
Sendeschritt).
Dabei ist ackListenerName der Name einer Bean, die Sie zusammen mit dem Anwendungsprogramm auf Senderseite deployen, um das Acknowledgment abzufragen.
Der mit den Anforderungsmethoden übergebene Name ackListenerName ist der Name einer EJB 2.0 Empfänger-Bean, um das Acknowledgement abzufragen. Der Name folgt der gleichen Konvention wie Proxy-Beans, zum Beispiel:
sap.com/MyTest/MyTestAckBean or localejbs/MyTestAckBean.
Analog zur Proxy-Bean muss das home-, das remote-, das localHome- und das local-Interface der Empfänger-Bean in der folgenden Weise im Deployment-Deskriptor (Datei ejb-jar.xml) deklariert sein, damit sie von der Java-Proxy-Laufzeit gefunden wird:
com.sap.aii.proxy.xiruntime.ack.AckListenerHome
com.sap.aii.proxy.xiruntime.ack.AckListenerRemote
com.sap.aii.proxy.xiruntime.ack.AckListenerLocalHome
com.sap.aii.proxy.xiruntime.ack.AckListenerLocal
Die Bean muss folgendes Java-Interface der Java-Proxy-Runtime implementieren:
com.sap.aii.proxy.xiruntime.ack.AckListener
Das Interface hat nur eine Methode, die aufgerufen wird, sobald die Java-Proxy-Runtime ein Acknowledgment emfpängt:
onAck(com.sap.aii.proxy.xiruntime.ack.AckMessage ack).
Diese Methode muss Teil der local- und localHome-Interfaces der Empfänger-Bean sein und in der Bean implementiert sein. Wenn ein Acknowledgment über eine der oben angegebenen Methoden angefordert wird, registriert die Java-Proxy-Laufzeit beim Senden der Message den Namen der Empfänger-Bean zusammen mit der Message-ID in einer Tabelle.
Bei Empfang einer Acknowledgment-Message ermittelt die Java-Proxy-Laufzeit die Empfänger-Bean über die Message-ID, auf die die Acknowledgment-Message verweist, instanziiert die Bean und ruft die Methode onAck() auf. Über das Interface AckMessage übergibt die Java-Proxy-Laufzeit der Methode Detail-Informationen über das Acknowledgment.

Die Java-Proxy-Laufzeit aggregiert keine Ackknowledgments. Die Methode onAck() wird für jede angeforderte Acknowledgement-Message aufgerufen.
Methoden des Interface AckMessage
Methode |
Rückgabewert(e) |
String getStatus(); |
Status des Acknowledgment: · OK, falls ein positives Acknowledgment empfangen wurde · Error, falls ein negatives Acknowledgment empfangen wurde oder · AckRequestNotSupported, wenn das angeforderte Acknowledgment nicht unterstützt wird beziehungsweise die Message, für die ein Acknowledgment angefordert wurde, auf Grund einer Verzweigung an mehrere Empfänger ging. Für die letzten beiden Werte gibt es weitere Methoden, um die Fehlerursache genauer zu bestimmen (siehe unten). |
String getCategory(); |
Fehlerkategorie transient oder permanent. Nur relevant, wenn getStatus() den Wert Error zurückgegeben hat. Falls getCategory() den Wert transient hat, wurde die asynchrone Message noch nicht erfolgreich übermittelt (zum Beispiel, weil der Empfänger nicht erreichbar ist), die Übermittlung könnte aber noch zu einem späteren Zeitpunkt erfolgreich sein. |
String getType(); |
Einer der folgenden Acknowledgment-Typen (siehe oben): ApplicationAck, ApplicationError, SystemAck oder SystemError. |
IGUID getRefToMsgId(); |
ID der Message, für die Sie das Acknowledgment angefordert haben. |
String getRefToMsgIdAsString(); |
ID der Message als String, für die Sie das Acknowledgment angefordert haben. |
Wenn getStatus() den Wert Error zurückgegeben hat, können Sie die folgenden Methoden verwenden, um mehr Informationen über die Fehlerursache zu bekommen:
AckMessage-Methoden für getStatus() == „Error“
Methode |
Rückgabewert |
String getErrorCode(); |
Fehlerkode |
String[] getErrorParameters(); |
Bis zu vier Fehlermeldungen oder null, falls keine Meldung mitgegeben wurde. |
String getApplicationFaultMessage(); |
Fault-Message. Nur relevant für den Fall getStatus() = “Error” und getType() = “ApplicationError” (siehe auch: Fehlerbehandlung). |
String |
Namensraum der Fault-Message. Nur relevant für den Fall getStatus() = “Error” und getType() = “ApplicationError”. |
Wenn getStatus() den Wert AckRequestNotSupported zurückgegeben hat, können sie die folgenden Methoden verwenden, um herauszufinden, welcher Acknowledgment-Typ vom Empfänger nicht unterstützt wird. Jede dieser Methoden gibt true zurück, wenn eine der XI Laufzeitkomponenten beziehungsweise der Empfänger das angeforderte Acknowledgment nicht unterstützt:
AckMessage-Methoden für getStatus() == „AckRequestNotSupported“
boolean systemNotSupported(); |
boolean systemErrorAckNotSupported(); |
boolean applicationAckNotSupported(); |
boolean applicationErrorAckNotSupported(); |
Die oben angegebenen Rückgabewerte lassen sich auch über Konstanten auswerten:
Konstanten der Klasse com.sap.aii.proxy.xiruntime.ack.AckConstant
Konstante |
Wert |
static AckConstant CATEGORY_PERMANENT |
“permanent” |
static AckConstant CATEGORY_TRANSIENT |
“transient” |
static AckConstant STATUS_ERROR |
“Error” |
static AckConstant STATUS_NOT_SUPPORTED |
“AckRequestNotSupported” |
static AckConstant STATUS_OK |
“OK” |
static AckConstant TYPE_APPLICATION_ACK |
“ApplicationAck” |
static AckConstant TYPE_APPLICATION_ERROR |
“ApplicationError” |
static AckConstant TYPE_SYSTEM_ACK |
“SystemAck” |
static AckConstant TYPE_SYSTEM_ERROR |
“SystemError” |
Die Klasse hat außerdem die Methoden toString(), valueOf() und geerbte Methoden der Klasse java.lang.Object.