Puede utilizar la API de invocación asíncrona para transferir sucesos que requieren un proceso en el contexto de una sesión de aplicación SIP (Session Initiation
Protocol) a cualquier servidor de un clúster basado en el ID de sesión de la aplicación relacionada. La API de invocación asíncrona transfiere la tarea de suceso al servidor correcto.
Antes de empezar
Lea la documentación de la API para obtener información acerca de las siguientes clases de trabajo asíncrono:
- com.ibm.websphere.sip.AsynchronousWork
- com.ibm.websphere.sip.AsynchronousWorkListener
Para obtener más información acerca de las clases de API, consulte la sección Referencia del Information Center y pulse las API para ver una lista de las especificaciones de las API del producto.
Acerca de esta tarea
Cuando ejecute código fuera de una hebra SIP, los desarrolladores de aplicaciones puede utilizar la API de invocación asíncrona para crear un objeto y configurar el servidor para que ejecute dicho objeto en una hebra diferente del mismo contenedor o en un servidor diferente, si es ahí donde está la sesión.
El ejemplo siguiente muestra la estructura de clases de la clase AsynchronousWork, que es la clase base abstracta que se amplía cuando se utiliza la 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();
}
Procedimiento
- Amplíe la clase abstracta AsynchronousWork con el código relacionado con SIP. La implementación ampliada del método doAsyncTask() se invoca en el servidor de destino que contiene SipApplicationSession y cuyo ID se ha establecido en el constructor que implementa la clase AsynchronousWork. La clase de implementación debe pasar el ID de sesión a la clase base invocando super en el constructor.
public class MyClass extends AsynchronousWork
{
String _sessionId;
public MyClass(String sessionId) {
super(sessionId);
_sessionId = sessionId;
}
// Este código se invoca en la máquina o hebra de destino
public Serializable doAsyncTask() {
// El código de la aplicación va aquí, por ejemplo:
appSession = sessionUtils.getApplicationSession(_sessionId);
appSession.createRequest().....
Serializable myResponse = new MyResponse();
myResponse.setStatus(200);
return (myResponse);
}
}
- Para recibir información acerca de la finalización de la tarea, implemente la clase
AsynchronousWorkListener, como en el ejemplo siguiente. El código de estos métodos se invoca en el servidor de origen.
public class MyListener implements AsynchronousWorkListener
{
public void workCompleted(Serializeable myResponse)
{
....
}
public void workFailed(int reasonCode, String reason)
{
}
}
- Para invocar la llamada asíncrona, por ejemplo, cuando recibe el mensaje de propiedad, utilice como ejemplo este código de ejemplo.
public void onMyMessage()
{
// Obtener el ID de sesión desde el mensaje o
// desde otro lugar
String sessionId = obtainIdFromMessage();
// Crear la clase ejecutable
MyClass myClass = new MyClass(sessionId);
// Crear el escucha
MyListener myListener = new MyListener();
// Entregarlo
myClass.dispatch(myListener);
}
Resultados
El contenedor SIP se asegura de que se invoque la tarea en el servidor correcto y en la hebra correcta, de modo que la aplicación puede evitar la sincronización en el nivel de sesión.