Refactoring of Generator Node
This commit is contained in:
parent
5faf9df11f
commit
52ffd5345c
@ -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) {
|
||||||
queue.ack(tenantId, msg, ackId.getId(), msg.getClusterPartition());
|
if (ackId != null) {
|
||||||
|
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,7 +268,9 @@ 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.
|
||||||
queue.ack(tenantId, msg, ackId.getId(), msg.getClusterPartition());
|
if (ackId != null) {
|
||||||
|
queue.ack(tenantId, msg, ackId.getId(), msg.getClusterPartition());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user