Tipps & Tricks - Polling

Allgemeines

Dieser Beitrag zeigt Ihnen, wie Sie mit dem Intrexx-Polling-Mechanismus in wenigen Minuten ganz gezielt Inhalte einer Seite austauschen können - und zwar nur dann, wenn dies auch benötigt wird. Er richtet sich an Leser mit etwas Programmier-Erfahrung. Oft gibt es die Anforderung, dass Teile einer Seite (z.B. eine oder mehrere Tabellen) aktualisiert werden sollen, wenn es Änderungen an den zugrundeliegenden Datensätzen gibt. Insbesondere ist dies der Fall, wenn es sich um Seiten handelt, die z.B. in Fabrikhallen angezeigt werden:

  • Andon-Board

  • Kanban-Board

  • Schwarzes Brett

  • Verpackungsvorschriften

  • Aktuelle Informationen zu Produktionsschritten an einer Maschine

  • Dashboards

und viele Anwendungsfälle mehr. Die Funktion wird benötigt, wenn das Portal nicht direkt von Mitarbeitern bedient wird, sondern ein gut sichtbarer Bildschirm automatisch aktualisiert werden muss. Oft gehen Entwickler so vor, dass sie in solchen Fällen die gesamte anzuzeigende Seite mit allen sichtbaren Elementen neu laden. Dies erhöht aber unnötig die Last auf den Server, da ja nicht immer Inhalte aktualisiert werden müssen. Bei vielen Vorgängen kann dieses Vorgehen zu erhöhten Ladezeiten führen.

Beispiel-Dateien

Hier können Sie die Beispieldateien "70-test-polling.xml" (Spring-Konfiguration) und "Polling-Sample.zip" (Applikation und Prozess) herunterladen.

Funktionsweise

Intrexx bietet eine Funktionalität, die es ermöglicht auf dem Server eine Zahl abzufragen. Diese Zahl ist mit einem Schlüssel verbunden.

Beispiel: "testKey": 15

Wenn sich ein Datensatz ändert, und Sie ein Neuladen erzwingen möchten, können Sie diese Zahl über einen Intrexx-Prozess erhöhen. Die Browserseite fragt diesen Wert in einem vorgegebenen Intervall ab. Sobald sich der Wert ändert, ruft der Polling-Mechanismus eine von Ihnen vorgegebene Funktion auf. Hier der Ablauf:

"testKey": 15 -> Änderung Datensatz wird ausgelöst -> Prozess reagiert und verändert den Wert: "testKey": 16 -> Polling wird ausgelöst: Lade Inhalte neu

Der Vorteil bei dieser Methode liegt darin, dass die Abfrage des Polling-Endpunktes nur ca. 4-5 Millisekunden dauert, das Laden einer ganzen Seite aber um einiges länger - mit vielen Inhalten bis zu 100-mal länger.

Umsetzung

Definition des Polling-Endpunkt

Der Polling-Endpunkt ist eine JavaKlasse mit dem Namen "JsonUsnPollingEndpoint". Er hat die Eigenschaft, den Wert in einer JSON-Struktur an den Client zurückzugeben. Damit dieser unter seinem Schlüssel erreicht werden kann, muss dies einem bestimmten Spring-Bean bekannt gegeben werden. Gehen Sie dazu wie folgt vor:

  1. Legen Sie eine Datei mit einem (möglichst eindeutigen) Namen im Portalverzeichnis internal/cfg/spring an (z.B. 77-meintestpolling.xml). "77" gibt die Sortierreihenfolge vor, in der die Konfigurationen geladen werden. Im Fall des Polling ist dies unerheblich.

  2. Kopieren Sie folgenden Inhalt in diese Datei:

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- Polling endpoint configuration --> 
    	<bean class="de.uplanet.lucy.server.polling.PollingEndpointConfigurator">		<property name="endpointName" value="testKey" />		<property name="endpoint">			<bean class="de.uplanet.lucy.server.polling.JsonUsnPollingEndpoint" /> 
    		</property> 
    	</bean></beans>
  3. Speichern Sie die Datei.

  4. Führen Sie einen Neustart des Portaldienstes aus, damit der neue Polling-Endpunkt aktiv ist.

Den Wert im Polling-Endpunkt über einen Prozess erhöhen

Gehen Sie dazu wie folgt vor:

  • Legen Sie einen neuen Prozess an.

  • Richten Sie einen Datengruppen-Ereignisbehandler auf Ihre Applikation ein.

  • Fügen Sie eine Groovy-Aktion hinzu. Mit dem folgenden Skript wird der Wert des Polling-Endpunktes erhöht:

    import de.uplanet.lucy.server.polling.PollingService;
    def endpoint = PollingService.getInstance().getEndpoint("testKey")
    if (endpoint) 
    	endpoint.incrementAndGetValue()

Polling-Javascript in der Applikation

Für das Polling muss nun noch das unten folgende JavaScript in der Applikation eingefügt werden. Die Seite, die aktualisiert werden soll, muss die Funktion "startPolling()" im onLoad-Event aufrufen. Im onUnload-Event muss die Funktion stopPolling() aufgerufen werden. Es ist Aufgabe des Entwicklers, die checkReload()-Funktion mit Leben zu füllen. Aktuell wird nur ein Hinweis im Browser angezeigt, wenn es eine Änderung gab.

/** 
* Wird im OnLoad der Seite aufgerufen. 
* Initialisiert den Pollingmechanismus 
* key: Dieser Wert (Im Beispiel "testKey") wird initial festgelegt und muss bei den 
* Bean-Properties definiert sein. Der verwendete Polling-EndPoint wird dann entsprechend 
* überprüft. 
* success (optional): Bei Abweichung des Wertes wird die Methode checkReload() 
* aufgerufen. 
* error(optional): Kommt es beim Lesen des Wertes vom EndPoint zu einem Fehler wird in 
* diesem Beispiel die Methode "errorOnPolling()" aufgerufen. 
* id: Mit dieser Subscriber-Id arbeitet das Polling intern. So können z.B. zu einem 
* identischen Key mehrere Polling-Anfragen mit unterschiedlicher Subscriber-Id 
* gestartet werden. 
* Weiterhin ist es so auch möglich, das Polling-Interval dynamisch anzupassen (z.B. 
* wenig Änderungen: langsamer) 
* millisec: Polling Interval in Millisekunden, im Beispiel 5000 
* @method startPolling 
*/ 

function startPolling()
{ 
	registerAjaxPolling({ 
		key: "testKey", 
		success: function(){ 
			checkReload(); 
		}, 
		error: function(){
			errorOnPolling(); 
		},
		id: "testId",
		millisec: 5000 
	}); 
}

/** 
* Beendet das Polling und sollte immer im OnUnload einer Seite aufgerufen werden 
* @method stopPolling 
*/ 

function stopPolling()
{ 
	unregisterAjaxPolling("testKey", "testId"); 
} 

//In diesem Beispiel wird die Tabelle auf der Übersichtsseite neu geladen 

function checkReload()

{ 
	alert("Page should be reloaded."); 
	return true; 
} 

// In diesem Beispiel wird ein Benachrichtigungs-Fenster angezeigt. 

function errorOnPolling()
{ 
	Notifier.status.notify("Text: Error on retrieving reload information", "Titel: Polling", "ID: MyId"); 
}

Polling sollte immer sparsam eingesetzt werden, da es Last auf dem Server erzeugt. Wählen Sie die Intervalle immer mit Bedacht.