...
|
...
|
@@ -18,6 +18,7 @@ package org.thingsboard.server.actors.rule; |
18
|
18
|
import java.util.*;
|
19
|
19
|
|
20
|
20
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
21
|
+import org.springframework.util.StringUtils;
|
21
|
22
|
import org.thingsboard.server.actors.ActorSystemContext;
|
22
|
23
|
import org.thingsboard.server.actors.plugin.RuleToPluginMsgWrapper;
|
23
|
24
|
import org.thingsboard.server.actors.shared.ComponentMsgProcessor;
|
...
|
...
|
@@ -113,8 +114,9 @@ class RuleActorMessageProcessor extends ComponentMsgProcessor<RuleId> { |
113
|
114
|
}
|
114
|
115
|
|
115
|
116
|
private void initAction() throws Exception {
|
116
|
|
- JsonNode actionMd = ruleMd.getAction();
|
117
|
|
- action = initComponent(actionMd);
|
|
117
|
+ if (ruleMd.getAction() != null && !ruleMd.getAction().isNull()) {
|
|
118
|
+ action = initComponent(ruleMd.getAction());
|
|
119
|
+ }
|
118
|
120
|
}
|
119
|
121
|
|
120
|
122
|
private void initProcessor() throws Exception {
|
...
|
...
|
@@ -131,9 +133,11 @@ class RuleActorMessageProcessor extends ComponentMsgProcessor<RuleId> { |
131
|
133
|
}
|
132
|
134
|
|
133
|
135
|
private void fetchPluginInfo() {
|
134
|
|
- PluginMetaData pluginMd = systemContext.getPluginService().findPluginByApiToken(ruleMd.getPluginToken());
|
135
|
|
- pluginTenantId = pluginMd.getTenantId();
|
136
|
|
- pluginId = pluginMd.getId();
|
|
136
|
+ if (!StringUtils.isEmpty(ruleMd.getPluginToken())) {
|
|
137
|
+ PluginMetaData pluginMd = systemContext.getPluginService().findPluginByApiToken(ruleMd.getPluginToken());
|
|
138
|
+ pluginTenantId = pluginMd.getTenantId();
|
|
139
|
+ pluginId = pluginMd.getId();
|
|
140
|
+ }
|
137
|
141
|
}
|
138
|
142
|
|
139
|
143
|
protected void onRuleProcessingMsg(ActorContext context, RuleProcessingMsg msg) throws RuleException {
|
...
|
...
|
@@ -162,25 +166,26 @@ class RuleActorMessageProcessor extends ComponentMsgProcessor<RuleId> { |
162
|
166
|
inMsgMd = new RuleProcessingMetaData();
|
163
|
167
|
}
|
164
|
168
|
logger.debug("[{}] Going to convert in msg: {}", entityId, inMsg);
|
165
|
|
- Optional<RuleToPluginMsg<?>> ruleToPluginMsgOptional = action.convert(ruleCtx, inMsg, inMsgMd);
|
166
|
|
- if (ruleToPluginMsgOptional.isPresent()) {
|
167
|
|
- RuleToPluginMsg<?> ruleToPluginMsg = ruleToPluginMsgOptional.get();
|
168
|
|
- logger.debug("[{}] Device msg is converter to: {}", entityId, ruleToPluginMsg);
|
169
|
|
- context.parent().tell(new RuleToPluginMsgWrapper(pluginTenantId, pluginId, tenantId, entityId, ruleToPluginMsg), context.self());
|
170
|
|
- if (action.isOneWayAction()) {
|
171
|
|
- pushToNextRule(context, msg.getCtx(), RuleEngineError.NO_TWO_WAY_ACTIONS);
|
172
|
|
- } else {
|
173
|
|
- pendingMsgMap.put(ruleToPluginMsg.getUid(), msg);
|
174
|
|
- scheduleMsgWithDelay(context, new RuleToPluginTimeoutMsg(ruleToPluginMsg.getUid()), systemContext.getPluginProcessingTimeout());
|
|
169
|
+ if (action != null) {
|
|
170
|
+ Optional<RuleToPluginMsg<?>> ruleToPluginMsgOptional = action.convert(ruleCtx, inMsg, inMsgMd);
|
|
171
|
+ if (ruleToPluginMsgOptional.isPresent()) {
|
|
172
|
+ RuleToPluginMsg<?> ruleToPluginMsg = ruleToPluginMsgOptional.get();
|
|
173
|
+ logger.debug("[{}] Device msg is converter to: {}", entityId, ruleToPluginMsg);
|
|
174
|
+ context.parent().tell(new RuleToPluginMsgWrapper(pluginTenantId, pluginId, tenantId, entityId, ruleToPluginMsg), context.self());
|
|
175
|
+ if (action.isOneWayAction()) {
|
|
176
|
+ pushToNextRule(context, msg.getCtx(), RuleEngineError.NO_TWO_WAY_ACTIONS);
|
|
177
|
+ } else {
|
|
178
|
+ pendingMsgMap.put(ruleToPluginMsg.getUid(), msg);
|
|
179
|
+ scheduleMsgWithDelay(context, new RuleToPluginTimeoutMsg(ruleToPluginMsg.getUid()), systemContext.getPluginProcessingTimeout());
|
|
180
|
+ }
|
175
|
181
|
}
|
176
|
182
|
} else {
|
177
|
183
|
logger.debug("[{}] Nothing to send to plugin: {}", entityId, pluginId);
|
178
|
|
- pushToNextRule(context, msg.getCtx(), RuleEngineError.NO_REQUEST_FROM_ACTIONS);
|
179
|
|
- return;
|
|
184
|
+ pushToNextRule(context, msg.getCtx(), RuleEngineError.NO_TWO_WAY_ACTIONS);
|
180
|
185
|
}
|
181
|
186
|
}
|
182
|
187
|
|
183
|
|
- public void onPluginMsg(ActorContext context, PluginToRuleMsg<?> msg) {
|
|
188
|
+ void onPluginMsg(ActorContext context, PluginToRuleMsg<?> msg) {
|
184
|
189
|
RuleProcessingMsg pendingMsg = pendingMsgMap.remove(msg.getUid());
|
185
|
190
|
if (pendingMsg != null) {
|
186
|
191
|
ChainProcessingContext ctx = pendingMsg.getCtx();
|
...
|
...
|
@@ -196,7 +201,7 @@ class RuleActorMessageProcessor extends ComponentMsgProcessor<RuleId> { |
196
|
201
|
}
|
197
|
202
|
}
|
198
|
203
|
|
199
|
|
- public void onTimeoutMsg(ActorContext context, RuleToPluginTimeoutMsg msg) {
|
|
204
|
+ void onTimeoutMsg(ActorContext context, RuleToPluginTimeoutMsg msg) {
|
200
|
205
|
RuleProcessingMsg pendingMsg = pendingMsgMap.remove(msg.getMsgId());
|
201
|
206
|
if (pendingMsg != null) {
|
202
|
207
|
logger.debug("[{}] Processing timeout detected [{}]: {}", entityId, msg.getMsgId(), pendingMsg);
|
...
|
...
|
@@ -269,18 +274,16 @@ class RuleActorMessageProcessor extends ComponentMsgProcessor<RuleId> { |
269
|
274
|
public void onActivate(ActorContext context) throws Exception {
|
270
|
275
|
logger.info("[{}] Going to process onActivate rule.", entityId);
|
271
|
276
|
this.state = ComponentLifecycleState.ACTIVE;
|
272
|
|
- if (action != null) {
|
273
|
|
- if (filters != null) {
|
274
|
|
- filters.forEach(f -> f.resume());
|
275
|
|
- } else {
|
276
|
|
- initFilters();
|
277
|
|
- }
|
|
277
|
+ if (filters != null) {
|
|
278
|
+ filters.forEach(RuleLifecycleComponent::resume);
|
278
|
279
|
if (processor != null) {
|
279
|
280
|
processor.resume();
|
280
|
281
|
} else {
|
281
|
282
|
initProcessor();
|
282
|
283
|
}
|
283
|
|
- action.resume();
|
|
284
|
+ if (action != null) {
|
|
285
|
+ action.resume();
|
|
286
|
+ }
|
284
|
287
|
logger.info("[{}] Rule resumed.", entityId);
|
285
|
288
|
} else {
|
286
|
289
|
start();
|
...
|
...
|
|