ThingWorx Modelldefinition in Composer > Modellierung > Dingvorlagen > Remote-Vorlagen > Dingpräsenz > Dingpräsenz: Benutzerdefinierte Berichterstattungsstrategie in Java mit dem ThingWorx Extension SDK erstellt
Dingpräsenz: Benutzerdefinierte Berichterstattungsstrategie in Java mit dem ThingWorx Extension SDK erstellt
In diesem Tutorial wird nicht auf die Grundlagen der Erstellung von ThingWorx Erweiterungen eingegangen. Es wird Folgendes vorausgesetzt:
Sie wissen, wie ThingWorx Erweiterungen erstellt werden.
Sie verfügen über das Extension SDK v.8.4.0 oder höher, das Berichterstattungsobjekte enthält.
Sie wissen, wie eine Erweiterung erstellt und in ThingWorx Platform importiert wird.
Ein benutzerdefiniertes Strategie-Ding kann in Java oder in JavaScript und XML erstellt werden. Zunächst müssen Sie eine Strategie-Dingvorlage erstellen und implementieren und die ReportingAlgorithm-Methode überschreiben. Dann erstellen Sie ein Strategie-Ding. In diesem Thema werden die Schritte zum Erstellen einer Strategie in Java erläutert. Informationen zum Erstellen eines Strategie-Dings mit JavaScript finden Sie unter Dingpräsenz: ThingWorx Composer zum Erstellen benutzerdefinierter ReportingStrategy-Dinge verwenden.
Strategie-Dingvorlagen erstellen
Um eine benutzerdefinierte Strategie in Java zu erstellen, erstellen Sie zunächst eine Strategie-Dingvorlage. Die Dingvorlage dient als Codebasis für einen Java-basierten Algorithmus. Die Klassendefinition für die Dingvorlage sollte wie folgt aussehen:
@ThingworxBaseTemplateDefinition(name = "ReportingStrategy")
public class MyJavaStrategy extends ReportingStrategy {
ReportingAlgorithm-Methode implementieren und überschreiben
Als Nächstes müssen Sie die ReportingAlgorithm-Methode implementieren und überschreiben. Diese Methode enthält eine Reihe von Anmerkungen, die für die ordnungsgemäße Funktion erforderlich sind. Die einfachste Lösung zur Sicherstellung der richtigen Implementierung besteht darin, den folgenden Code zu kopieren:
@Override
@ThingworxServiceDefinition(name = ReportingConstants.REPORTING_ALGORITHM_SERVICE_NAME, isAllowOverride = true,
description = "Evaluates a Thing to determine if it is Present")
@ThingworxServiceResult(name = CommonPropertyNames.PROP_RESULT, baseType = "BOOLEAN",
description = "Whether the parameters describe a Device that is Reporting normally")
public Boolean ReportingAlgorithm(
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_NAME,
description = "Name of the event",
baseType = "STRING" ) String eventName,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_TIME,
description = "Time event is triggered",
baseType = "DATETIME" ) DateTime eventTime,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE,
description = "Name of Thing that triggered event",
baseType = "STRING" ) String source,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE_PROPERTY,
description = "Soure property",
baseType = "STRING" ) String sourceProperty,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_DATA,
description = "Parameters necessary for the algorithm to determine if a Thing is reporting",
baseType = "INFOTABLE") InfoTable eventData) {
// specifically boolean primitive; this method should never return null
boolean result = false;

// TODO: Custom Strategy implementation here

return result;
}
Beispiel einer benutzerdefinierten Strategie-Dingvorlage
Ein Beispiel für eine benutzerdefinierte Strategie-Dingvorlage sieht wie folgt aus. In diesem Beispiel markiert die benutzerdefinierte Strategie das Ding als vorhanden, wenn es nicht verbunden ist, und als nicht vorhanden, wenn es verbunden ist.

import org.joda.time.DateTime;
import org.slf4j.Logger;

import com.thingworx.logging.LogUtilities;
import com.thingworx.metadata.annotations.ThingworxBaseTemplateDefinition;
import com.thingworx.metadata.annotations.ThingworxServiceDefinition;
import com.thingworx.metadata.annotations.ThingworxServiceParameter;
import com.thingworx.metadata.annotations.ThingworxServiceResult;
import com.thingworx.things.connected.reportable.ReportingConstants;
import com.thingworx.things.connected.reportable.ReportingStrategy;
import com.thingworx.types.InfoTable;
import com.thingworx.types.constants.CommonPropertyNames;

@ThingworxBaseTemplateDefinition(name = "ReportingStrategy")
public class MyJavaStrategy extends ReportingStrategy {

private static final Logger logger =
LogUtilities.getInstance().getApplicationLogger(MyJavaStrategy.class);

@Override
@ThingworxServiceDefinition(name = ReportingConstants.REPORTING_ALGORITHM_SERVICE_NAME,
isAllowOverride = true,
description = "Evaluates a Thing to determine if it is Present")
@ThingworxServiceResult(name = CommonPropertyNames.PROP_RESULT, baseType = "BOOLEAN",
description = "Whether the parameters describe a Device that is Reporting normally")
public Boolean ReportingAlgorithm(
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_NAME,
description = "Name of the event",
baseType = "STRING" ) String eventName,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_TIME,
description = "Time event is triggered",
baseType = "DATETIME" ) DateTime eventTime,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE,
description = "Name of Thing that triggered event",
baseType = "STRING" ) String source,
@ThingworxServiceParameter(
name = ReportingConstants.SOURCE_PROPERTY,
description = "Soure property",
baseType = "STRING" ) String sourceProperty,
@ThingworxServiceParameter(
name = ReportingConstants.EVENT_DATA,
description = "Parameters necessary for the algorithm to determine if a Thing is reporting",
baseType = "INFOTABLE") InfoTable eventData) {
// specifically boolean primitive; this method should never return null
boolean result;
try {
boolean isBound = (Boolean) eventData.getFirstRow().getValue(ReportingConstants.PROP_ISBOUND);
result = !isBound;
logger.info("Custom strategy has is bound [" + isBound + "].
Setting reporting to [" + result + "]");
} catch (Exception e) {
logger.error("Caught exception while evaluating reporting algorithm.
Marking as not reporting");
result = false;
}
return result;
}

}
Strategie-Dinge erstellen
Das Strategie-Ding erweitert die benutzerdefinierte Strategievorlage und ermöglicht es Ihnen, sie als Berichterstattungsalgorithmus in der Konfigurationstabelle der Berichterstattung für eine Remote-Entität festzulegen.
Um ein Ding zu erstellen, muss das Projekt den folgenden Ordnerpfad für Entitäten verwenden: <Projektstamm>/Entities/Things. Außerdem müssen die Dinge der Namenskonvention Things_ThingName.xml entsprechen, wobei ThingName der Name Ihres benutzerdefinierten Dings ist.
In diesem Beispiel ist der Dingname "CustomStrategyJava", sodass der Dateiname Things_CustomStrategyJava.xml lautet; der Inhalt wird unten angezeigt. Sie müssen die Zeilen 14, 19 und 23 basierend auf dem ThingPackage-, ThingName- bzw. ThingTemplate-Namen bearbeiten.
* 
Nachdem Sie die Zeilen unten in einen IDE- oder XML-Editor kopiert haben, werden die richtigen Zeilennummern angezeigt.
<?xml version="1.0" encoding="UTF-8"?>
<Entities
<Things>
<Thing
effectiveThingPackage="MyStrategyPackage"
enabled="true"
name="CustomStrategyJava"
published="false"
thingTemplate="MyJavaStrategy"
</Thing>
</Things>
</Entities>
Strategien ausführen
Ab ThingWorx 8.4.0 wird der Status isReporting eines Remote-Dings erneut ausgewertet, wenn das Ding gebunden oder seine Bindung an ThingWorx Platform aufgehoben wird. Dieser Status kann auch jederzeit neu ausgewertet werden (z.B. durch einen Zeitgeber), indem der für das Remote-Ding verfügbare EvaluateReporting-Dienst ausgeführt wird ist.
War dies hilfreich?