Vous pouvez utiliser l'API Asynchronous Invocation pour transférer des événements devant être traités dans le contexte d'une session d'application SIP (Session Initiation Protocol) sur tous les serveurs d'un cluster basés sur l'ID de session de l'application concernée. L'API Asynchronous Invocation transfère ainsi cette tâche aux bons serveurs.
Avant de commencer
Consultez la documentation sur l'API pour en savoir plus sur les classes de travail asynchrone suivantes :
- com.ibm.websphere.sip.AsynchronousWork
- com.ibm.websphere.sip.AsynchronousWorkListener
Pour en savoir plus sur les classes d'API, consultez la section Référence du centre de documentation et cliquez sur API (Application Programming Interfaces) pour afficher la liste des caractéristiques des API.
Pourquoi et quand exécuter cette tâche
Lorsqu'ils exécutent du code en dehors d'une unité d'exécution SIP, les développeurs d'applications peuvent utiliser l'API Asynchronous Invocation pour créer un objet et configurer le serveur destiné à l'exécution de cet objet soit sur une autre unité d'exécution du même conteneur, soit sur un autre serveur, selon l'emplacement où réside la session.
L'exemple suivant illustre la structure de la classe AsynchronousWork, laquelle constitue la classe abstraite étendue par l'utilisation de 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
- Etendre la classe abstraite AsynchronousWork à l'aide du code SIP connexe. L'implémentation étendue de la méthode doAsyncTask() est appelée sur le serveur cible qui contient la SipApplicationSession et dont l'ID a été configuré dans le constructeur qui implémente la classe AsynchronousWork. La classe d'implémentation doit transférer l'ID de 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;
}
// Ce code est appelé sur la machine ou l'unité d'exécution cible
public Serializable doAsyncTask() {
// Le code applicatif s'inscrit ici, comme suit par exemple :
appSession = sessionUtils.getApplicationSession(_sessionId);
appSession.createRequest().....
Serializable myResponse = new MyResponse();
myResponse.setStatus(200);
return (myResponse);
}
}
- Pour recevoir des informations sur l'avancement de la tâche, implémentez la classe AsynchronousWorkListener en suivant 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)
{
}
}
- Pour invoquer l'appel asynchrone, lorsque vous recevez le message propriétaire par exemple, prenez exemple sur cet échantillon de code.
public void onMyMessage()
{
// Obtenir l'ID de session depuis le message ou
// ailleurs
String sessionId = obtainIdFromMessage();
// Créer l'exécutable
MyClass myClass = new MyClass(sessionId);
// Créer le programme d'écoute
MyListener myListener = new MyListener();
// Répartir
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, de manière à ce que l'application soit dispensée de la synchronisation au niveau de la session.