Definizione del modello ThingWorx in Composer > Modellazione > Modelli di oggetto > Modelli remoti > Presenza di oggetto > Presenza di oggetto: strategia di report personalizzata creata in Java con ThingWorx Extension SDK
Presenza di oggetto: strategia di report personalizzata creata in Java con ThingWorx Extension SDK
Questo tutorial non fornisce le nozioni di base per la creazione delle estensioni ThingWorx. Il tutorial si basa sui presupposti riportati di seguito
Si conosce la procedura di creazione di un'estensione ThingWorx.
Si dispone dell'SDK dell'estensione, v.8.4.0 o versioni successive, che include oggetti di report.
Si conosce la procedura di creazione e importazione di un'estensione in ThingWorx Platform.
È possibile creare un oggetto strategia personalizzata in Java o in JavaScript e XML. È innanzitutto necessario creare un modello di oggetto strategia e implementare e ignorare il metodo ReportingAlgorithm. Quindi creare un oggetto strategia. In questo argomento vengono illustrati i passi per la creazione di una strategia in Java. Per creare una strategia usando JavaScript, vedere Presenza di oggetto: utilizzo di ThingWorx Composer per creare un oggetto ReportingStrategy personalizzato.
Creare un modello di oggetto strategia
Per creare una strategia personalizzata in Java, è necessario prima creare un modello di oggetto strategia. Il modello di oggetto funge da base di codice per un algoritmo basato su Java. La definizione della classe per il modello di oggetto dovrebbe essere simile alla seguente:
@ThingworxBaseTemplateDefinition(name = "ReportingStrategy")
public class MyJavaStrategy extends ReportingStrategy {
Implementare e sovrascrivere il metodo ReportingAlgorithm
Successivamente, è necessario implementare e sovrascrivere il metodo ReportingAlgorithm. Questo metodo include una serie di annotazioni necessarie per garantire il funzionamento corretto. La soluzione più semplice per garantire un'implementazione corretta è copiare il seguente codice:
@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;
}
Esempio di modello di oggetto strategia personalizzata
Un modello di oggetto strategia personalizzata sarebbe simile all'esempio riportato di seguito. In questo esempio la strategia personalizzata contrassegna l'oggetto come presente quando non è connesso e non presente quando è connesso.

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

}
Creare un modello di strategia
L'oggetto strategia estende il modello di strategia personalizzata consentendo di impostarlo come algoritmo di report nella tabella di configurazione report su un'entità remota.
Per creare un oggetto, il progetto deve avere il percorso della cartella Entities seguente <Radice progetto>/Entities/Things e gli oggetti devono rispettare la convenzione sull'attribuzione dei nomi seguente: Things_ThingName.xml, dove ThingName è il nome dell'oggetto personalizzato.
In questo esempio il nome dell'oggetto è "CustomStrategyJava", quindi il nome del file è Things_CustomStrategyJava.xml e il contenuto è mostrato sotto. Sarà necessario modificare le righe 14, 19 e 23 rispettivamente in base ai nomi ThingPackage, ThingName e ThingTemplate.
* 
Dopo aver copiato le righe di seguito nell'editor IDE o XML, verranno visualizzati i numeri di riga corretti.
<?xml version="1.0" encoding="UTF-8"?>
<Entities
<Things>
<Thing
effectiveThingPackage="MyStrategyPackage"
enabled="true"
name="CustomStrategyJava"
published="false"
thingTemplate="MyJavaStrategy"
</Thing>
</Things>
</Entities>
Esecuzione di una strategia
A partire da ThingWorx 8.4.0, lo stato isReporting di un oggetto remoto verrà rivalutato ogni volta che l'oggetto viene associato a ThingWorx Platform o ne viene annullata l'associazione. Questo stato può anche essere rivalutato in qualsiasi momento, ad esempio da un timer, eseguendo il servizio EvaluateReporting disponibile sull'oggetto remoto.
È stato utile?