Refactoring of Generator Node

This commit is contained in:
Igor Kulikov 2018-07-12 12:51:42 +03:00
parent 5faf9df11f
commit 52ffd5345c
2 changed files with 26 additions and 9 deletions

View File

@ -248,7 +248,9 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
int relationsCount = relations.size(); int relationsCount = relations.size();
EntityId ackId = msg.getRuleNodeId() != null ? msg.getRuleNodeId() : msg.getRuleChainId(); EntityId ackId = msg.getRuleNodeId() != null ? msg.getRuleNodeId() : msg.getRuleChainId();
if (relationsCount == 0) { if (relationsCount == 0) {
if (ackId != null) {
queue.ack(tenantId, msg, ackId.getId(), msg.getClusterPartition()); queue.ack(tenantId, msg, ackId.getId(), msg.getClusterPartition());
}
} else if (relationsCount == 1) { } else if (relationsCount == 1) {
for (RuleNodeRelation relation : relations) { for (RuleNodeRelation relation : relations) {
pushToTarget(msg, relation.getOut(), relation.getType()); pushToTarget(msg, relation.getOut(), relation.getType());
@ -266,9 +268,11 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
} }
} }
//TODO: Ideally this should happen in async way when all targets confirm that the copied messages are successfully written to corresponding target queues. //TODO: Ideally this should happen in async way when all targets confirm that the copied messages are successfully written to corresponding target queues.
if (ackId != null) {
queue.ack(tenantId, msg, ackId.getId(), msg.getClusterPartition()); queue.ack(tenantId, msg, ackId.getId(), msg.getClusterPartition());
} }
} }
}
private boolean contains(Set<String> relationTypes, String type) { private boolean contains(Set<String> relationTypes, String type) {
if (relationTypes == null) { if (relationTypes == null) {

View File

@ -47,11 +47,12 @@ import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
public class TbMsgGeneratorNode implements TbNode { public class TbMsgGeneratorNode implements TbNode {
public static final String TB_MSG_GENERATOR_NODE_MSG = "TbMsgGeneratorNodeMsg"; private static final String TB_MSG_GENERATOR_NODE_MSG = "TbMsgGeneratorNodeMsg";
private TbMsgGeneratorNodeConfiguration config; private TbMsgGeneratorNodeConfiguration config;
private ScriptEngine jsEngine; private ScriptEngine jsEngine;
private long delay; private long delay;
private long lastScheduledTs;
private EntityId originatorId; private EntityId originatorId;
private UUID nextTickId; private UUID nextTickId;
private TbMsg prevMsg; private TbMsg prevMsg;
@ -66,28 +67,40 @@ public class TbMsgGeneratorNode implements TbNode {
originatorId = ctx.getSelfId(); originatorId = ctx.getSelfId();
} }
this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "prevMsg", "prevMetadata", "prevMsgType"); this.jsEngine = ctx.createJsScriptEngine(config.getJsScript(), "prevMsg", "prevMetadata", "prevMsgType");
sentTickMsg(ctx); scheduleTickMsg(ctx);
} }
@Override @Override
public void onMsg(TbContext ctx, TbMsg msg) { public void onMsg(TbContext ctx, TbMsg msg) {
if (msg.getType().equals(TB_MSG_GENERATOR_NODE_MSG) && msg.getId().equals(nextTickId)) { if (msg.getType().equals(TB_MSG_GENERATOR_NODE_MSG) && msg.getId().equals(nextTickId)) {
withCallback(generate(ctx), withCallback(generate(ctx),
m -> {ctx.tellNext(m, SUCCESS); sentTickMsg(ctx);}, m -> {
t -> {ctx.tellFailure(msg, t); sentTickMsg(ctx);}); ctx.tellNext(m, SUCCESS);
scheduleTickMsg(ctx);
},
t -> {
ctx.tellFailure(msg, t);
scheduleTickMsg(ctx);
});
} }
} }
private void sentTickMsg(TbContext ctx) { private void scheduleTickMsg(TbContext ctx) {
long curTs = System.currentTimeMillis();
if (lastScheduledTs == 0L) {
lastScheduledTs = curTs;
}
lastScheduledTs = lastScheduledTs + delay;
long curDelay = Math.max(0L, (lastScheduledTs - curTs));
TbMsg tickMsg = ctx.newMsg(TB_MSG_GENERATOR_NODE_MSG, ctx.getSelfId(), new TbMsgMetaData(), ""); TbMsg tickMsg = ctx.newMsg(TB_MSG_GENERATOR_NODE_MSG, ctx.getSelfId(), new TbMsgMetaData(), "");
nextTickId = tickMsg.getId(); nextTickId = tickMsg.getId();
ctx.tellSelf(tickMsg, delay); ctx.tellSelf(tickMsg, curDelay);
} }
private ListenableFuture<TbMsg> generate(TbContext ctx) { private ListenableFuture<TbMsg> generate(TbContext ctx) {
return ctx.getJsExecutor().executeAsync(() -> { return ctx.getJsExecutor().executeAsync(() -> {
if (prevMsg == null) { if (prevMsg == null) {
prevMsg = ctx.newMsg( "", originatorId, new TbMsgMetaData(), "{}"); prevMsg = ctx.newMsg("", originatorId, new TbMsgMetaData(), "{}");
} }
TbMsg generated = jsEngine.executeGenerate(prevMsg); TbMsg generated = jsEngine.executeGenerate(prevMsg);
prevMsg = ctx.newMsg(generated.getType(), originatorId, generated.getMetaData(), generated.getData()); prevMsg = ctx.newMsg(generated.getType(), originatorId, generated.getMetaData(), generated.getData());