Définition du modèle ThingWorx dans Composer > Modélisation > Modèles d'objet > Modèles distants > Présence d'objet > Présence d'objet : stratégie de reporting personnalisée créée dans Java avec le kit Extension SDK ThingWorx
Présence d'objet : stratégie de reporting personnalisée créée dans Java avec le kit Extension SDK ThingWorx
Ce didacticiel n'aborde pas les bases de la création d'extensions ThingWorx. Il est supposé que :
vous savez comment créer une extension ThingWorx ;
vous disposez du kit Extension SDK (8.4.0 ou version ultérieure) qui contient les objets de reporting ;
vous savez comment créer et importer une extension dans ThingWorx Platform.
Il est possible de créer un objet de stratégie personnalisée dans Java ou dans JavaScript et XML. Vous devez d'abord créer un modèle d'objet de stratégie, puis implémenter et remplacer la méthode ReportingAlgorithm. Vous créez ensuite un objet de stratégie. Cette rubrique décrit les étapes de création d'une stratégie dans Java. Pour créer un objet de stratégie à l'aide de JavaScript, consultez la rubrique Présence d'objet : utilisation de ThingWorx Composer pour créer un objet ReportingStrategy personnalisé.
Création d'un modèle d'objet de stratégie
Pour créer une stratégie personnalisée dans Java, commencez par créer un modèle d'objet de stratégie. Le modèle d'objet sert de base de code pour un algorithme basé sur Java. La définition de classes pour le modèle d'objet doit être similaire à l'exemple suivant :
@ThingworxBaseTemplateDefinition(name = "ReportingStrategy")
public class MyJavaStrategy extends ReportingStrategy {
Implémentation et remplacement de la méthode ReportingAlgorithm
Vous devez ensuite implémenter et remplacer la méthode ReportingAlgorithm. Cette méthode contient plusieurs annotations requises pour un bon fonctionnement. Pour garantir une implémentation correcte, le plus simple est de copier le code suivant :
@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;
}
Exemple de modèle d'objet de stratégie personnalisée
Un modèle d'objet de stratégie personnalisée serait similaire à l'exemple suivant. Dans cet exemple, la stratégie personnalisée marque l'objet comme présent lorsqu'il n'est pas connecté et non présent lorsqu'il l'est.

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

}
Création d'un objet de stratégie
L'objet de stratégie étend votre modèle de stratégie personnalisée et vous permet de la définir en tant qu'algorithme de reporting dans la table de configuration de reporting sur une entité distante.
Pour créer un objet, le chemin du dossier Entities doit être défini sur <Dossier racine>/Entities/Things pour votre projet, tandis que vos objets doivent respecter la convention de désignation Things_ThingName.xml, où ThingName correspond au nom de votre objet personnalisé.
Dans cet exemple, le nom d'objet étant "CustomStrategyJava", le nom du fichier est Things_CustomStrategyJava.xml et le contenu est affiché ci-dessous. Vous devez modifier les lignes 14, 19 et 23 en conséquence selon les noms ThingPackage, ThingName et ThingTemplate.
* 
Une fois les lignes ci-dessous copiées dans votre éditeur IDE ou XML, vous verrez les numéros de ligne.
<?xml version="1.0" encoding="UTF-8"?>
<Entities
<Things>
<Thing
effectiveThingPackage="MyStrategyPackage"
enabled="true"
name="CustomStrategyJava"
published="false"
thingTemplate="MyJavaStrategy"
</Thing>
</Things>
</Entities>
Exécution d'une stratégie
A partir de ThingWorx 8.4.0, l'état isReporting d'un objet distant est réévalué à chaque liaison ou annulation de liaison de l'objet avec ThingWorx Platform. Cet état peut également être réévalué à tout moment (par exemple, au moyen d'un timer) en exécutant le service EvaluateReporting disponible sur l'objet distant.