Dienste erstellen, implementieren und testen
Dingdienste sind Funktionen, die ein Ding durchführen kann. Dienste werden intern auf ThingWorx Platform und von Mashups verwendet, und sie können von jeder externen Quelle mit entsprechendem Zugriff erreicht werden. Sie können Dienste nur für die folgenden ThingWorx Entitäten definieren:
Dinge
Dingvorlagen
Dingformen
Ressourcen
Authentifikatoren
Dienste werden über JavaScript, SQL oder Java implementiert.
* 
Java ist nur für Erweiterungen verfügbar.
Ein Dienst kann über eine URL, eine REST-Client-Lösung oder einen anderen Dienst in ThingWorx aufgerufen werden.
Erstellen Sie benutzerdefinierte Dienste für Ihr Modell in ThingWorx, um die Anforderungen Ihres Projekts zu erfüllen.
Optimale Vorgehensweisen für das Erstellen und Implementieren von Diensten
Verwenden Sie beim Erstellen und Implementieren von Diensten die folgenden optimalen Vorgehensweisen:
Definieren Sie Benennungskonventionen für Ihre Dienste. Beachten Sie die folgenden Punkte:
Geben Sie einen logischen, aussagekräftigen Namen und eine Beschreibung für den Dienst an.
Verwenden Sie eine Standardnomenklatur für Dienste. Beispiel: Verwenden Sie als Präfix für den Dienstnamen ein Verb und eine Beschreibung des Dienstes. Einige Beispiele für Verben finden Sie nachfolgend:
Verb
Beschreibung
Get
Werte aus der Datenbank abrufen
Set
Wert von Datenbankeinträgen festlegen
Query
Gruppe von Datensätzen aus der Datenbank zurückgeben
Add
Datensätze zur Datenbank hinzufügen
Update
Datensätze in der Datenbank aktualisieren
Delete
Datensätze in der Datenbank löschen
Validate
Datensätze in der Datenbank validieren
Purge
Datensätze in der Datenbank bereinigen
Create
Satz von Datensätzen in der Datenbank erstellen
Import
Daten in die Datenbank importieren
Export
Daten aus der Datenbank exportieren
Parse
Daten parsen
Beispiel: Für einen Dienst, der historische Daten abruft, ist getHistory der empfohlene Name anstelle von History.
Vermeiden Sie mehrdeutige Namen.
Vermeiden Sie lange Dienstnamen, wenn möglich.
Weitere Informationen finden Sie im Abschnitt Entitäten benennen.
Gruppieren Sie allgemeine Eigenschaften und Dienste in einer einzelnen Entität, vorzugsweise in einer Dingform.
Wenn möglich, implementieren Sie Dienste in Dingformen.
* 
Es wird empfohlen, Dingformen zum Definieren der Eigenschaften und Dienste zu verwenden. Wenn Sie Eigenschaften und Dienste in einer Dingvorlage definieren, ist es schwierig, ihre Definitionen in eine Dingform zu verschieben.
Entwerfen Sie Dienste für verschiedene Ebenen, z.B. Benutzeroberfläche, Geschäftslogik und Datenabruf. Die Dienste auf den verschiedenen Ebenen haben unterschiedliche Zuständigkeiten. Die folgende Abbildung enthält ein Beispiel für die Zuständigkeiten auf verschiedenen Ebenen:
Versuchen Sie beim Schreiben eines Dienstes, die verfügbaren Ausschnitte aus der ThingWorx Codeausschnitt-Bibliothek wiederzuverwenden. Wenn Sie nicht sicher sind, wie Sie die Codeausschnitte verwenden, testen Sie sie, bevor Sie sie in Ihrem Dienst verwenden.
Beachten Sie beim Erstellen des Diensts mit JSON-Ausgabe Folgendes:
Wenn die Eigenschaften die Werte null oder undefined haben, werden sie nicht im Ergebnis zurückgegeben.
Beispiel:
var test = {
test1: "aaa",
test2: 123,
test3: null,
test4: undefined
};
var result = test;
Ausgabe: {"test1": "aaa", "test2": 123}
Wenn die Eigenschaft ein JSON-Objekt und auf null festgelegt ist, wird sie im Ergebnis zurückgegeben.
Beispiel:
var test = {
test1: "aaa",
test2: 123,
test3: null,
test4: undefined,
"line_categories": [ null ]
};
var result = test;
Ausgabe: {"test1": "aaa", "test2": 123, "line_categories": [ null ]}
Wenn Sie erwarten, dass Ihr Dienst viel Zeit in Anspruch nimmt, stellen Sie sicher, dass der Benutzer den Dienst nicht mehrmals gleichzeitig auslösen kann.
Wenn der Dienst auf einem Ereignis-Trigger in einem Mashup basiert, verwenden Sie das ServiceInvokeCompleted-Ereignis, um den Datenfluss in einer Lösung zuzulassen.
Um Daten in Mashups zu aktualisieren, wird empfohlen, das Widget "Automatisch aktualisieren" oder den GetProperties-Dienst zu verwenden.
Wenn ein Mashup den GetProperties-Dienst verwendet und der Browser WebSockets unterstützt, erhält der Browser automatisch Werte der aktualisierten Eigenschaften in Echtzeit vom Server. In diesem Fall ist es nicht erforderlich, die Funktion "Automatisch aktualisieren" zu verwenden. Diese Funktion ist nur verfügbar, wenn Sie das Kontrollkästchen Werte automatisch aktualisieren, wenn neue Werte vorhanden sind im Fensterbereich mit Diensteigenschaften aktivieren.
Wenn Sie die Funktion "Automatisch aktualisieren" verwenden, empfiehlt PTC, die Funktion "Automatisch aktualisieren" auf mindestens 15 Sekunden festzulegen, um eine Belastung Ihres Systems zu vermeiden.
* 
Verwenden Sie keinen serverseitigen Verzögerungsdienst, da er dazu führen kann, dass andere Dienste blockiert werden. Dies kann zu einem Absturz der Lösung führen.
Für einfache Konvertierungen zur Laufzeit wird empfohlen, das Widget "Ausdruck" anstatt Diensten zu verwenden.
Wenn beispielsweise die Temperatur in °C anzeigt wird und Sie möchten, dass der Benutzer sie in °F anzeigen kann, verwenden Sie das Widget "Ausdruck".
Fügen Sie dem Code Prüfungen hinzu, um zu vermeiden, dass der Endbenutzer einen Fehler erhält.
Wenn Ihr Code beispielsweise eine Reihe von Eingabeparametern für die Ausführung benötigt, erstellen Sie Prüfungen, um sicherzustellen, dass diese Eingabeparameter nicht Null sind, wenn der Dienst ausgeführt wird.
Wenn die Lösung lokalisiert wird und Text in den Benutzeroberflächenelementen vorhanden ist, der sich dynamisch auf Grundlage des Ergebnisses von Diensten ändert, stellen Sie sicher, dass Sie keine Textwerte in Ihren Diensten hartcodieren, die im Mashup angezeigt werden. Dies liegt daran, dass das Ergebnis der Dienste, die den Text zurückgeben, lokalisiert werden muss. Auf diese Weise können Sie den UI-Text auch in Zukunft einfacher verwalten und ändern.
Beim Erstellen von benutzerdefinierten Diensten müssen Sie entscheiden, welche Benutzer oder Benutzergruppen über die Berechtigungen zum Aufrufen dieses Diensts verfügen sollen. Weitere Informationen finden Sie unter Auf der ThingWorx Platform erstellte Lösungen mithilfe von Sichtbarkeit und Berechtigungen sichern.
Ein mögliches Ergebnis der Ausführung von Diensten kann die Erstellung von Ghost-Entitäten sein. Ghost-Entitäten werden dynamisch über Code/Skripterstellung erstellt und nicht über ThingWorx Composer. Das Erstellen von Ghost-Entitäten ist nicht ratsam. Weitere Informationen finden Sie unter Ghost-Entitäten erstellen und löschen.
Die Standardeinstellung für das Skript-Timeout auf ThingWorx Platform ist 30 Sekunden. Wenn die Ausführung eines Skripts länger dauert als die Standardeinstellung, beendet ThingWorx Platform die Ausführung. Der ThingWorx Administrator kann das Skript-Timeout im Abschnitt "Basic Settings" der Datei platform-settings.json konfigurieren.
Optimale Vorgehensweisen für das Testen von Diensten
Verwenden Sie beim Testen von Diensten die folgenden optimalen Vorgehensweisen:
Testen Sie Ihren Dienst inkrementell, während Sie ihn erstellen. Verwenden Sie ggf. Skript-Protokollierer-Meldungen.
* 
Jeder Dienst mit einer Endlosschleife kann den ThingWorx Server zum Absturz bringen.
Prüfen Sie beim Testen eines Dienstes die Protokolle auf Fehlermeldungen. Dies ist besonders nützlich für Dienste in Abonnements. Die folgenden Protokolldateien sind hilfreich:
ErrorLog.log – Bietet detaillierte Stapel-Ablaufverfolgung für Fehler
ScriptErrorLog.log – Bietet Dienstkontextinformationen (Stapelfehler-Zeilennummer)
Fehler werden in dieser Datei nur protokolliert, wenn Sie das Kontrollkästchen Stapel-Ablaufverfolgung für Skript aktivieren auf der Registerkarte Konfiguration des Untersystems LoggingSubsystem aktivieren.
* 
Die obigen Dateien sind im Ordner ThingworxStorage/logs verfügbar. Sie benötigen Zugriff auf den ThingWorx Server, um diese Dateien zu lesen.
Wenn der Dienst aus einem Mashup aufgerufen wird, testen Sie ihn in Composer und im Mashup.
Wenn Benutzereingaben erforderlich sind, damit der Dienst ausgeführt werden kann, können Sie die Funktion "Validierer" verwenden.
Verwenden Sie die Entwicklertools, die in Browsern zur Verfügung stehen, um das Ergebnis eines Dienstes zu prüfen. Dies ist hilfreich, wenn Sie eine Sequenz von Diensten debuggen möchten, die in einem Mashup ausgeführt wird. Dieses Tool zeigt die Dienstergebnisse im Kontext dieser spezifischen Ausführung an.
Tipps
Wenn Sie nach Diensten suchen möchten, öffnen Sie die Entität nicht im Bearbeitungsmodus. Verwenden Sie den Vorschaulink links neben dem Namen der Entität, um die Entität im Ansichtsmodus zu öffnen.
Andere Aspekte
Sicherheit: Verwenden Sie für mehr Sicherheit Dienstüberschreibungen, um Berechtigungen für wichtige Dienste zu verweigern, die auf ThingWorx Platform verfügbar sind.
Upgrades: Verwenden Sie gute Codierungsmethoden, und erstellen Sie keine großen monolithischen Dienste.
Parallelitätsmuster – ThingWorx Dingdienste werden nicht isoliert von der Anwendungs-Engine ausgeführt. Daher sind Änderungen an Dingmodell-Eigenschaften, die für einen Dienst vorgenommen wurden, sofort in allen anderen gleichzeitig ausgeführten Diensten sichtbar. Wenn zwei Dienste gleichzeitig versuchen, dieselbe Eigenschaft zu schreiben, werden beide Schreibvorgänge erfolgreich ausgeführt. Der Eigenschaftswert hat schließlich den Status, der zuletzt ausgeführt wurde, und kann sich von der Reihenfolge unterscheiden, in der die Schreibvorgänge an den Server gesendet wurden. Im Allgemeinen wird beim gleichzeitigen Zugriff auf die meisten Daten und Ressourcen innerhalb von ThingWorx Platform der Ansatz "Last-Write-Wins" verfolgt. Anwendungsentwickler und Architekten sollten diese Verhaltensweisen beim Erstellen von Anwendungen berücksichtigen.
War dies hilfreich?