Muster 'Worklight Adapters and the Worklight: push notification from WebSphere MQ'

Bei Worklight-Adaptern handelt es sich um den serverseitigen Code von Anwendungen, die auf der Worklight-Plattform für mobile Anwendungen implementiert sind und dort gewartet werden. Adapter stellen eine Verbindung vom Worklight-Server zu Unternehmensanwendungen her, beispielsweise zu denen, die in WebSphere Message Broker ausgeführt werden. Die folgende Sequenz durchläuft die Übergabe von Benachrichtigungen und startet dabei mit einer Provideranwendung und endet mit einer mobilen Anwendung:

  1. Die Provideranwendung reiht eine Benachrichtigung in die Warteschlange ein.
  2. Der Worklight-Adapter wird aktiviert und ruft den Service in WebSphere Message Broker auf, um die als nächstes verfügbare Benachrichtigung anzufordern, die in der Nachrichtenwarteschlange wartet.
  3. Falls eine Benachrichtigung zurückgegeben wird, wandelt der Adapter die XML-SOAP-Antwort in ein JSON-Benachrichtigungsobjekt für Worklight um.
  4. Der Adapter ruft die Subskription für den Benutzer ab, der in der Benachrichtigung angegeben wurde.
  5. Falls die Subskription vorhanden ist, fordert der Adapter Worklight auf, die Benachrichtigung zu übergeben.
  6. Falls die Subskription nicht vorhanden ist, protokolliert der Adapter das Ereignis und löscht die Nachricht.
  7. Worklight sendet die Benachrichtigung an den relevanten Benachrichtigungsserver (z. B. APN).
  8. Der Server für die Push-Benachrichtigung sorgt dafür, dass die Benachrichtigung an die mobile Einheit übergeben wird.
  9. Die mobile Anwendung empfängt die Benachrichtigung (dies ist von verschiedenen plattformspezifischen Faktoren abhängig).

Generierte Dateien

In diesem Abschnitt werden die Dateien erläutert, die für den Worklight-Adapter generiert wurden.

Worklight-Adapter

Das Muster erstellt einen Worklight-Adapter mit zwei Konfigurationsdateien. Bei der ersten Konfigurationsdatei handelt es sich um die XML-Datei des Adapters. Mit der XML-Datei des Adapters wird die Verbindung zu Message Broker konfiguriert. Im folgenden Beispiel wird die generierte XML-Konfigurationsdatei des Adapters gezeigt:

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

Viele der Werte in dieser XML-Datei des Adapters werden aus Musterparametern konfiguriert (z. B. displayName, domain und port).

Das Muster generiert auch eine JavaScript-Datei, die die Adapterimplementierung für die Benachrichtigung enthält. Der Schlüsselabschnitt befindet sich am Anfang dieser generierten Datei, wo der Adapter die Ereignisquelle konfiguriert. Der Ereignisquellenname muss mit dem Namen der Ereignisquelle übereinstimmen, welche die mobile Anwendung subskribiert.

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

XML Schema

Das unten gezeigte XML-Schema gibt das Format der Benachrichtigungen an, die in die Warteschlange gestellt und vom Web-Service zurückgegeben werden.

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

Das Element Payload (Nutzdaten) wird vom Muster mit den Namen aller zusätzlichen anwendungsspezifischen Felder gefüllt.

Ein Auszug aus der WSDL für den Web-Service der Push-Benachrichtigung wird im Anschluss gezeigt.

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

Der durch dieses Muster generierte Adapter verwendet die Operation GetNotification, um anstehende Push-Benachrichtigungen aus Message Broker abzurufen. Der Web-Service stellt ebenfalls eine PutNotification-Operation bereit. Diese Operation richtet sich an Provideranwendungen, die das Einreihen von Benachrichtigungen in Message Broker durch den Aufruf eines Web-Service dem Schreiben einer Nachricht in eine Warteschlange vorziehen.

Zurück zur Spezifikation des Musters 'Worklight: push notification from WebSphere MQ'