Vous pouvez utiliser l'API d'appel asynchrone pour transférer des événements à traiter
dans le contexte d'une session d'application SIP (Session
Initiation Protocol) vers un serveur d'un cluster, en fonction d'un identificateur de session d'application. L'API d'appel asynchrone transfère la tâche d'événement au serveur approprié.
Avant de commencer
Reportez-vous à la documentation de l'API pour des informations sur les classes de travail asynchrone suivantes :
- com.ibm.websphere.sip.AsynchronousWork
- com.ibm.websphere.sip.AsynchronousWorkListener
Pour en savoir plus sur les classes API, voir Interfaces de programmation (API et SPI).
Pourquoi et quand exécuter cette tâche
Lors de l'exécution de code hors unité d'exécution SIP, les développeurs d'applications
peuvent utiliser l'API d'appel asynchrone pour créer un objet. Ils peuvent ensuite configurer
le serveur pour exécuter cet objet sur une unité d'exécution différente du même conteneur ou sur un autre serveur
si la session existe sur ce serveur.
L'exemple suivant montre la structure de classe
de la classe AsynchronousWork, qui est la classe de base abstraite étendue lorsque vous utiliser l'API.
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();
}
Procédure
- Etendez la classe abstraite AsynchronousWork avec code SIP. L'implémentation étendue de la méthode doAsyncTask() est appelée
sur le serveur cible contenant SipApplicationSession, et dont l'ID a été défini
dans le constructeur qui implémente la classe AsynchronousWork. La classe d'implémentation doit transmettre l'ID session à la classe de base
en appelant super dans le constructeur.
public class MyClass extends AsynchronousWork
{
String _sessionId;
public MyClass(String sessionId) {
super(sessionId);
_sessionId = sessionId;
}
// This code is invoked on the target machine or thread
public Serializable doAsyncTask() {
// Application code goes here; for instance:
appSession = sessionUtils.getApplicationSession(_sessionId);
appSession.createRequest().....
Serializable myResponse = new MyResponse();
myResponse.setStatus(200);
return (myResponse);
}
}
- Pour recevoir des informations sur l'achèvement de la tâche,
implémentez la classe AsynchronousWorkListener, comme dans l'exemple ci-après. Le code de ces méthodes est appelé sur le serveur source.
public class MyListener implements AsynchronousWorkListener
{
public void workCompleted(Serializeable myResponse)
{
....
}
public void workFailed(int reasonCode, String reason)
{
}
}
- Appelez l'appel asynchrone. Par exemple, lorsque vous recevez
le message de propriété, utilisez cet échantillon de code comme exemple.
public void onMyMessage()
{
// Obtain the session ID from the message or
// somewhere else
String sessionId = obtainIdFromMessage();
// Create the runnable
MyClass myClass = new MyClass(sessionId);
// Create the listener
MyListener myListener = new MyListener();
// Dispatch it
myClass.dispatch(myListener);
}
Résultats
Le conteneur SIP garantit que la tâche est appelée sur le bon serveur
et sur la bonne unité d'exécution, afin que l'application puisse
éviter la synchronisation de niveau session.