Desarrollo de aplicaciones que utilizan la API de invocación asíncrona

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 comenzar

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 sobre las clases de API, consulte la sección Referencia en la documentación y pulse API - Interfaces de programación de aplicaciones para ver una lista de las especificaciones de 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

  1. 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;
    }
    
    // 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);
    }
    }
  2. 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)
    {
    }
    }
    
  3. 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()
    {
    // 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);
    }

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.