Community Tip - Did you get an answer that solved your problem? Please mark it as an Accepted Solution so others with the same problem can find the answer easily. X
Hello everybody,
has anyone exprience or can help to create a MultiEventSubscription using the ExtensionSDK?
So I am currently using Thingworx 9.6.1 with the ExtensionSDK 9.6.0. The latest available Eclipse Plugin i found is 9.0.1. When I use this combination to create an Extension and a ThingShape with an event and a subscription i get this result:
@ThingworxEventDefinitions(events = { @ThingworxEventDefinition(name = "Message", description = "", category = "Message", dataShape = "TWX.Core.Message_DS", isInvocable = true, isPropertyEvent = false, isLocalOnly = false, aspects = {}) }) @ThingworxSubscriptions(subscriptions = { @ThingworxSubscription(source = "", eventName = "Message", sourceProperty = "", handler = "OnMessage", enabled = true) }) public class ActorTS { private static Logger _logger = LogUtilities.getInstance().getApplicationLogger(ActorTS.class); public ActorTS() { // TODO Auto-generated constructor stub } @ThingworxServiceDefinition(name = "OnMessage", description = "Subscription handler", category = "", isAllowOverride = false, aspects = {"isAsync:false" }) public void OnMessage( @ThingworxServiceParameter(name = "eventData", description = "", baseType = "INFOTABLE") InfoTable eventData, @ThingworxServiceParameter(name = "eventName", description = "", baseType = "STRING") String eventName, @ThingworxServiceParameter(name = "eventTime", description = "", baseType = "DATETIME") DateTime eventTime, @ThingworxServiceParameter(name = "source", description = "", baseType = "STRING") String source, @ThingworxServiceParameter(name = "sourceProperty", description = "", baseType = "STRING") String sourceProperty) { } }
But I deeper look into the ExtensionSDK.shows, that there are special annotations for @ThingworxMultiEventSubscription:
@Target({ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @ThingworxExtensionApiAnnotation(since = {9, 5, 1}) public @interface ThingworxMultiEventSubscription { String name() default ""; String description() default ""; boolean enabled() default false; String handler(); String[] aspects() default {}; ThingworxSubscriptionEvent[] events() default {}; }
Solved! Go to Solution.
Hi Constantin,
that was the right hint ... especially the @ThingworxSubscriptionEvent-Annotation. But some more steps to go:
- I wanted the Subscription to be stateful and sequentially => aspects = { "isStateful:true" }
- I don't wanted to show up the Subscription Handler as a Separate Service => isPrivate = true
- The parameters of the Subscription Handler are different as it is a "MultiEventSubscription" ...
@ThingworxEventDefinitions(events = {
@ThingworxEventDefinition(name = "Message", description = "", category = "AMQP", dataShape = "TWX.Core.Message_DS", isInvocable = true, isPropertyEvent = false, isLocalOnly = true, aspects = {}),
})
@ThingworxMultiEventSubscriptions(subscriptions = {
@ThingworxMultiEventSubscription(name = "SubMessageNew", enabled = true, handler = "OnMessageNew", aspects = { "isStateful:true" }, events = {
@ThingworxSubscriptionEvent(source = "", eventName = "Message", sourceProperty = "", alias = "ME_Message") })
})
public class ActorTS {
@ThingworxServiceDefinition(name = "OnMessageNew", description = "Subscription handler", category = "", isPrivate = true, isAllowOverride = false, aspects = { "isAsync:false" })
public void OnMessageNew(
@ThingworxServiceParameter(name = "events", description = "", baseType = "INFOTABLE") InfoTable events,
@ThingworxServiceParameter(name = "thisSub", description = "", baseType = "INFOTABLE") InfoTable thisSub
) {
LOGGER.trace("Entering Service: OnMessageNew with:");
LOGGER.trace("Exiting Service: OnMessageNew");
}
}
Still not everything clear (PTC please provide a more detailed explanation of Annotations and especially the aspects!), but it's running as intended ...
Hello, in your example I'd expect it to work like this:
@ThingworxEventDefinitions(events = {
@ThingworxEventDefinition(name = "Message", description = "", category = "Message", dataShape = "TWX.Core.Message_DS", isInvocable = true, isPropertyEvent = false, isLocalOnly = false, aspects = {})
})
@ThingworxMultiEventSubscriptions(subscriptions = {
@ThingworxMultiEventSubscription(enabled = true, handler = "OnMessage", events = {
@ThingworxSubscriptionEvent(source = "Thing1", eventName = "Message", sourceProperty = "", alias = "MessageFromThing1"),
@ThingworxSubscriptionEvent(source = "Thing2", eventName = "Message", sourceProperty = "", alias = "MessageFromThing2")
}),
})
public class ActorTS {
private static Logger _logger = LogUtilities.getInstance().getApplicationLogger(ActorTS.class);
public ActorTS() {
// TODO Auto-generated constructor stub
}
@ThingworxServiceDefinition(name = "OnMessage", description = "Subscription handler", category = "", isAllowOverride = false, aspects = {"isAsync:false" })
public void OnMessage(
@ThingworxServiceParameter(name = "eventData", description = "", baseType = "INFOTABLE") InfoTable eventData,
@ThingworxServiceParameter(name = "eventName", description = "", baseType = "STRING") String eventName,
@ThingworxServiceParameter(name = "eventTime", description = "", baseType = "DATETIME") DateTime eventTime,
@ThingworxServiceParameter(name = "source", description = "", baseType = "STRING") String source,
@ThingworxServiceParameter(name = "sourceProperty", description = "", baseType = "STRING") String sourceProperty) {
}
}
Hi Constantin,
that was the right hint ... especially the @ThingworxSubscriptionEvent-Annotation. But some more steps to go:
- I wanted the Subscription to be stateful and sequentially => aspects = { "isStateful:true" }
- I don't wanted to show up the Subscription Handler as a Separate Service => isPrivate = true
- The parameters of the Subscription Handler are different as it is a "MultiEventSubscription" ...
@ThingworxEventDefinitions(events = {
@ThingworxEventDefinition(name = "Message", description = "", category = "AMQP", dataShape = "TWX.Core.Message_DS", isInvocable = true, isPropertyEvent = false, isLocalOnly = true, aspects = {}),
})
@ThingworxMultiEventSubscriptions(subscriptions = {
@ThingworxMultiEventSubscription(name = "SubMessageNew", enabled = true, handler = "OnMessageNew", aspects = { "isStateful:true" }, events = {
@ThingworxSubscriptionEvent(source = "", eventName = "Message", sourceProperty = "", alias = "ME_Message") })
})
public class ActorTS {
@ThingworxServiceDefinition(name = "OnMessageNew", description = "Subscription handler", category = "", isPrivate = true, isAllowOverride = false, aspects = { "isAsync:false" })
public void OnMessageNew(
@ThingworxServiceParameter(name = "events", description = "", baseType = "INFOTABLE") InfoTable events,
@ThingworxServiceParameter(name = "thisSub", description = "", baseType = "INFOTABLE") InfoTable thisSub
) {
LOGGER.trace("Entering Service: OnMessageNew with:");
LOGGER.trace("Exiting Service: OnMessageNew");
}
}
Still not everything clear (PTC please provide a more detailed explanation of Annotations and especially the aspects!), but it's running as intended ...