Verwenden Sie die Anwendungsprogrammierschnittstelle für asynchrone Aufrufe, um Ereignisse,
die in einer SIP-Anwendungssitzung (Session Initiation Protocol) verarbeitet werden müssen, basierend
auf einer Anwendungssitzungs-ID an einen Server in einem Cluster zu übertragen.
Die API für asynchrone Aufrufe überträgt die Ereignistask zur Ausführung an den richtigen Server.
Vorbereitende Schritte
Lesen Sie in der API-Dokumentation die Informationen zu den folgenden asynchronen Arbeitsklassen:
- com.ibm.websphere.sip.AsynchronousWork
- com.ibm.websphere.sip.AsynchronousWorkListener
Informationen zu den API-Klassen finden Sie im Abschnitt "Referenzinformationen"
im Information Center. Unter "APIs" finden Sie eine Liste der Spezifikationen für die Produkt-APIs.
Informationen zu diesem Vorgang
Wenn Anwendungsentwickler Code außerhalb eines SIP-Threads ausführen,
können sie die API für asynchrone Aufrufe verwenden, um ein Objekt zu erstellen,
und den Server so konfigurieren, dass sie dieses Objekt entweder in einem anderen Thread
im selben Container bzw. auf einem anderen Server (falls die Sitzung sich hier befindet) ausführen.
Das folgende Beispiel zeigt die Klassenstruktur
für die Klasse "AsynchronousWork", die abstrakte Basisklasse, die bei der Verwendung der API erweitert wird.
public abstract class AsynchronousWork implements Serializable
{
private String sessionId;
public AsynchronousWork(String sessionId)
{
this.sessionId = sessionId;
....
}
public void dispatch (AsynchronousWorkListener listener)
{
....
}
public abstract Serializable doAsyncTask();
}
Vorgehensweise
- Erweitern Sie die abstrakte Klasse AsynchronousWork um den zugehörigen SIP-Code. Die erweiterte Implementierung der Methode doAsyncTask() wird auf dem Zielserver aufgerufen, der die SipApplicationSession enthält und
dessen ID in dem Konstruktor, der die Klasse AsynchronousWork implementiert, definiert wurde. Die Implementierungsklasse muss die Sitzungs-ID durch Aufruf
von "super" im Konstruktor an die Basisklasse übergeben.
public class MyClass extends AsynchronousWork
{
String _sessionId;
public MyClass(String sessionId) {
super(sessionId);
_sessionId = sessionId;
}
// Dieser Code wird auf der Zielmaschine bzw. im Ziel-Thread aufgerufen
public Serializable doAsyncTask() {
// Anwendungscode ist hier aufgeführt. Beispiel:
appSession = sessionUtils.getApplicationSession(_sessionId);
appSession.createRequest().....
Serializable myResponse = new MyResponse();
myResponse.setStatus(200);
return (myResponse);
}
}
- Implementieren Sie die Klasse AsynchronousWorkListener, um Informationen zum Abschluss der Task zu erhalten. Beispiel: Der Code in diesen Methoden wird auf dem Quellenserver aufgerufen.
public class MyListener implements AsynchronousWorkListener
{
public void workCompleted(Serializeable myResponse)
{
....
}
public void workFailed(int reasonCode, String reason)
{
}
}
- Verwenden Sie den folgenden Beispielcode als Beispiel für einen asynchronen Aufruf, etwa beim Empfang
der proprietären Nachricht.
public void onMyMessage()
{
// Rufen Sie die Sitzungs-ID aus der Nachricht oder aus einer anderen Position ab
String sessionId = obtainIdFromMessage();
// Erstellen Sie das ausführbare Objekt
MyClass myClass = new MyClass(sessionId);
// Erstellen Sie den Listener
MyListener myListener = new MyListener();
// Teilen Sie den Listener zu.
myClass.dispatch(myListener);
}
Ergebnisse
Der SIP-Container stellt sicher, dass die Task im richtigen Server und im richtigen Thread aufgerufen wird, damit die Anwendung die Synchronisation
auf Sitzungsebene vermeiden kann.