Adaptadores Worklight e o Padrão Worklight: Notificação Push do WebSphere MQ

Adaptadores Worklight são o código lado do servidor dos aplicativos implementados no e atendidos pelo Worklight Mobile Application Platform. Os adaptadores conectam o Worklight Server a aplicativos corporativos, como aqueles em execução no WebSphere Message Broker. A sequência a seguir explica a entrega de notificações, começando em um aplicativo do fornecedor e terminando com um aplicativo remoto:

  1. O aplicativo do fornecedor coloca uma mensagem de notificação na fila.
  2. O adaptador Worklight é ativado e chama o serviço no WebSphere Message Broker para solicitar a próxima mensagem de notificação disponível aguardando na fila de mensagens.
  3. Se uma mensagem de notificação for retornada, o adaptador converterá a resposta SOAP XML em um objeto de notificação JSON para o Worklight.
  4. O adaptador recupera a assinatura para o usuário identificado na mensagem de notificação.
  5. Se a assinatura existir, o adaptador pedirá ao Worklight para entregar a mensagem de notificação.
  6. Se a assinatura não existir, o adaptador registrará o evento e descartará a mensagem.
  7. O Worklight envia a mensagem de notificação para o servidor de notificação relevante (por exemplo, APN).
  8. O servidor de notificação push organiza a notificação para ser entregue ao dispositivo móvel.
  9. O aplicativo remoto recebe a notificação (isso depende de diversos fatores específicos da plataforma).

Arquivos Gerados

Esta seção explica os arquivos gerados para o adaptador Worklight.

Adaptador Worklight

O padrão cria um adaptador Worklight com dois arquivos de configuração. O primeiro arquivo de configuração é o arquivo XML do adaptador. O arquivo XML do adaptador é usado para configurar a conectividade com o Message Broker. O exemplo abaixo mostra o arquivo de configuração XML do adaptador gerado:

    <?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: push notifications adapter</description>
        <connectivity>
            <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
                <protocol>http</protocol>
                <domain>localhost</domain>
                <port>7800</port>
            </connectionPolicy>
            <loadConstraints maxConcurrentConnectionsPerNode="1" />
        </connectivity>
    </wl:adapter>

Muitos dos valores nesse arquivo XML do adaptador são configurados a partir de parâmetros padrão (por exemplo, displayName, domain e port).

O padrão também gera um arquivo JavaScript contendo a implementação do adaptador de notificação. A seção chave nesse arquivo gerado está na parte superior onde o adaptador configura a origem de eventos. O nome da origem de eventos deve corresponder ao nome da origem de eventos que o aplicativo remoto assina.

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

Esquema XML

O esquema XML mostrado abaixo especifica o formato das mensagens de notificação colocadas na fila e retornadas pelo serviço da 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="en">Request message to get the next available pending notification.</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="en">Response message for next available pending notification.</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="en">Request message to add a pending notification message.</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="en">Response message for putting a pending notification messages.</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="en">Application specific data in the notification messages.</xsd:documentation>
            </xsd:annotation>
            <xsd:sequence>
            </xsd:sequence>
        </xsd:complexType>
        
        <xsd:complexType name="Notification">
            <xsd:annotation>
                <xsd:documentation xml:lang="en">Data definition for notification messages.</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>

O elemento Payload é preenchido pelo padrão com nomes de quaisquer campos específicos do aplicativo adicionais.

Uma extração do WSDL de serviço da web da notificação push é mostrada abaixo.

    <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>

O adaptador gerado por esse padrão usa a operação GetNotification para recuperar notificações push pendentes do Message Broker. O serviço da web também fornece uma operação PutNotification. Essa operação é para aplicativos do fornecedor que poderiam preferir enfileirar notificações com o Message Broker chamando um serviço da web em vez de gravar uma mensagem em uma fila.

Voltar à especificação do padrão Worklight: notificação push do WebSphere MQ