Adaptadores Worklight y el patrón Worklight: envío de notificaciones desde WebSphere MQ

Los adaptadores Worklight son el código del lado del servidor de las aplicaciones desplegadas en la plataforma de aplicaciones móviles de Worklight y a las que ésta da servicio. Los adaptadores conectan Worklight Server con las aplicaciones empresariales, como las que se ejecutan en WebSphere Message Broker. La secuencia siguiente describe la entrega de notificaciones comenzando por una aplicación de proveedor y terminando por una aplicación móvil:

  1. La aplicación del proveedor coloca un mensaje de notificación en la cola.
  2. El adaptador Worklight se activa e invoca el servicio en WebSphere Message Broker para solicitar el siguiente mensaje de notificación disponible que esperando en la cola de mensajes.
  3. Si se devuelve un mensaje de notificación, el adaptador convierte la respuesta XML SOAP en un objeto de notificación JSON para Worklight.
  4. El adaptador recupera la suscripción para el usuario identificado en el mensaje de notificación.
  5. Si existe la suscripción, el adaptador solicita a Worklight que entregue el mensaje de notificación.
  6. Si la suscripción no existe, el adaptador registra el suceso y elimina el mensaje.
  7. Worklight envía el mensaje de notificación al servidor de notificaciones pertinente (por ejemplo, APN).
  8. El servidor de envío de notificaciones organiza la entrega de la notificación al dispositivo móvil.
  9. La aplicación móvil recibe la notificación (esto depende de varios factores específicos de la plataforma).

Archivos generados

Esta sección describe los archivos generados para el adaptador Worklight.

Adaptador Worklight

El patrón crea un adaptador Worklight con dos archivos de configuración. El primer archivo de configuración es el archivo XML de adaptador. El archivo XML de adaptador se utiliza para configurar la conectividad con Message Broker. El ejemplo siguiente muestra el archivo de configuración XML de adaptador generado:

    <?xml version="1.0" encoding="UTF-8"?>
    <wl:adapter name="PushAdapter"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:wl="http://www.worklight.com/integration"
        xmlns:http="http://www.worklight.com/integration/http">
    
        <displayName>PushAdapter</displayName>
        <description>Worklight: adaptador de notificaciones push</description> <connectivity>
            <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
                <protocol>http</protocol>
                <domain>localhost</domain>
                <port>7800</port>
            </connectionPolicy>
            <loadConstraints maxConcurrentConnectionsPerNode="1" />
        </connectivity>
    </wl:adapter>

Muchos de los valores de este archivo XML de adaptador están configurados a partir de parámetros de patrón (por ejemplo, displayName, domain y port).

El patrón también genera un archivo JavaScript que contiene la implementación del adaptador de notificaciones. La sección clave de este archivo generado se encuentra en la parte superior, donde el adaptador configura el origen de los sucesos. El nombre del origen de sucesos debe coincidir con el nombre del origen de sucesos al que está suscrita la aplicación móvil.

    WL.Server.createEventSource({
        name : "PushEventSource",
        onDeviceSubscribe : "deviceSubscribeFunc",
        onDeviceUnsubscribe : "deviceUnsubscribeFunc",
        poll : {
            interval : 30,
            onPoll: "getNotifications"
        }
    });

Esquema XML

El esquema XML que se muestra a continuación especifica el formato de los mensajes de notificación puestos en la cola y devueltos por el servicio web.

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:tns="urn://patterns/worklight" targetNamespace="urn://patterns/worklight">
    
        <xsd:element name="GetNotification">
            <xsd:annotation>
                <xsd:documentation xml:lang="es">Mensaje de solicitud para obtener la siguiente notificación pendiente disponible.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="AdapterName" type="xsd:string"/>
                    <xsd:element name="EventSource" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>

        <xsd:element name="GetNotificationResponse">
            <xsd:annotation>
                <xsd:documentation xml:lang="es">Mensaje de respuesta para la siguiente notificación pendiente disponible.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="Notification" type="tns:Notification"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>

        <xsd:element name="PutNotification">
            <xsd:annotation>
                <xsd:documentation xml:lang="es">Mensaje de solicitud para añadir un mensaje de notificación pendiente.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="Notification" type="tns:Notification"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>

        <xsd:element name="PutNotificationResponse">
            <xsd:annotation>
                <xsd:documentation xml:lang="es">Mensaje de respuesta para colocar un mensaje de notificación pendiente.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="AdapterName" type="xsd:string"/>
                    <xsd:element name="EventSource" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>

        <xsd:complexType name="Payload">
            <xsd:annotation>
                <xsd:documentation xml:lang="es">Datos específicos de la aplicación en los mensajes de notificación.</xsd:documentation>
            </xsd:annotation>
            <xsd:sequence>
            </xsd:sequence>
        </xsd:complexType>

        <xsd:complexType name="Notification">
            <xsd:annotation>
                <xsd:documentation xml:lang="es">Definición de datos para mensajes de notificación.</xsd:documentation>
            </xsd:annotation>
               <xsd:sequence>
                  <xsd:element name="UserId" type="xsd:string"/>
                  <xsd:element minOccurs="0" name="Badge" type="xsd:string"/>
                  <xsd:element minOccurs="0" name="Sound" type="xsd:string"/>
                  <xsd:element minOccurs="0" name="ActivateButtonLabel" type="xsd:string"/>
                  <xsd:element minOccurs="0" name="NotificationText" type="xsd:string"/>
                  <xsd:element minOccurs="0" name="Payload" type="tns:Payload"/>
               </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>

El patrón rellena el elemento Payload con los nombres de los campos específicos de aplicación adicionales.

El siguiente es un extracto del WSDL del servicio web de envío de notificaciones.

    <wsdl:definitions name="Notification" targetNamespace="urn://patterns/worklight" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn://patterns/worklight" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <wsdl:types>
            <xsd:schema targetNamespace="urn://patterns/worklight" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                <xsd:include schemaLocation="Notification.xsd"/>
            </xsd:schema>
        </wsdl:types>
        <wsdl:message name="GetNotification">
            <wsdl:part element="tns:GetNotification" name="GetNotification"/>
        </wsdl:message>
        <wsdl:message name="GetNotificationResponse">
            <wsdl:part element="tns:GetNotificationResponse" name="GetNotificationResponse"/>
        </wsdl:message>
        <wsdl:message name="PutNotification">
            <wsdl:part element="tns:PutNotification" name="PutNotification"/>
        </wsdl:message>
        <wsdl:message name="PutNotificationResponse">
            <wsdl:part element="tns:PutNotificationResponse" name="PutNotificationResponse"/>
        </wsdl:message>
        <wsdl:portType name="NotificationPortType">
            <wsdl:operation name="GetNotification">
                <wsdl:input message="tns:GetNotification"/>
                <wsdl:output message="tns:GetNotificationResponse"/>
            </wsdl:operation>
            <wsdl:operation name="PutNotification">
                <wsdl:input message="tns:PutNotification"/>
                <wsdl:output message="tns:PutNotificationResponse"/>
            </wsdl:operation>
        </wsdl:portType>
        <wsdl:binding name="NotificationSOAPBinding" type="tns:NotificationPortType">
            <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="GetNotification">
                <soap:operation soapAction="http://notification/get"/>
                <wsdl:input>
                    <soap:body use="literal"/>
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="literal"/>
                </wsdl:output>
            </wsdl:operation>
            <wsdl:operation name="PutNotification">
                <soap:operation soapAction="http://notification/put"/>
                <wsdl:input>
                    <soap:body use="literal"/>
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="literal"/>
                </wsdl:output>
            </wsdl:operation>
        </wsdl:binding>
    </wsdl:definitions>

El adaptador generado por este patrón utiliza la operación GetNotification para recuperar notificaciones de envío pendientes de Message Broker. El servicio web también proporciona una operación PutNotification. Esta operación está disponible para las aplicaciones de proveedor que prefieren poner en cola las notificaciones con Message Broker llamando a un servicio web, en lugar de escribir un mensaje en una cola.

Volver a la especificación del patrón Worklight: envío de notificaciones desde WebSphere MQ