应用场景
假设您需要使用ThingsBoard规则引擎实现“计数器”逻辑。 由于消息处理在规则节点内部异步执行,大多数情况下,“获取当前计数值 -> 加上新计数值 -> 保存计数值”这种逻辑会因竞态条件而产生与预期不符的错误结果。 这是多线程编程中常见的问题。您可参考这篇文章了解该问题及现有解决方案。 自ThingsBoard v2.5起,可通过可配置队列解决该处理问题。
在本教程中,我们将配置ThingsBoard规则引擎,使用具有“按来源顺序提交”消息策略的队列。 尽管该场景为虚构示例,您将学习如何使用队列实现消息顺序处理,并在实际应用中运用该知识。
前置条件
我们假定您已完成以下指南并阅读了所列文章:
此外,您需要在环境中至少预置一个设备。
步骤1:创建规则链

我们将添加两个生成器节点,每个生成七条消息。第一个生成器将产生计数值为101的消息。 第二个生成器产生计数值为10的消息。因此最终结果应为777。

两条消息都将放入 SequentialByOriginator 队列。该队列使用消息提交策略 SEQUENTIAL_BY_ORIGINATOR,即基于来源实体的后续消息将在前一条消息被确认(处理完成并从队列删除)后开始处理。
我们使用 originator attributes 节点获取当前“计数器”值。当前禁用“若任一属性缺失则告知失败”,因为设备可能尚不具备所需属性,启用会导致错误。
该属性将在第一条消息到达 save attributes 节点后设置到设备。

使用 script 节点执行计算。

最后一步是使用 save attributes 节点保存新的计数值。

步骤2:验证规则链逻辑
保存规则链以验证我们的逻辑是否正确。生成器将自动产生14条消息:

持久化到设备的最终计数值为:

这说明我们的逻辑正确无误。
快速总结
下载并导入本教程附带的规则链JSON 文件。 别忘了在生成器节点中填写您的具体设备。