Nifi - 转换以前保存的 now() 属性

Nifi - Converting previously saved now() in attribute

我使用 UpdateAttribute 检查慢速处理器的计时。第一个 UpdateAttribute 具有 DATA_START ${now()},而第二个具有 DATA_STOP ${now()} 属性。慢处理器位于两者之间。

我一直在尝试将 DATA_START 转换为数字,以便计算时差。

${now():toNumber():minus(${DATA_START:toNumber()}):format("HH:mm:ss")}

不幸的是,这不起作用。问题出在这部分${DATA_START:toNumber()}。 NiFi 无法将之前保存的 now() 转换为数字。

我的流程中有很多计时器,因此添加包含 ${now():toNumber()} 的新属性会很麻烦。

有什么方法可以将 toNumber() 应用到之前保存的 now() 吗?

各种类型的formattoDate()都不行。

@Alex 为什么不存储原始值并将它们用于差异检查?如果您需要两者,仍然可以转换为人类可读的格式。解决方案是只创建 2 个属性而不是一个。

DATA_START_RAW = ${now()}

DATA_START_FORMATED = ${now():toNumber():format("HH:mm:ss")}

我怀疑你只是没有找到合适的表达语言。这有时会很棘手,尤其是格式化时间戳和“数学”...

另外一个建议:不要在流程中OVERCHECK流程表现。这并不是真正的最佳实践概念。我不知道你的用例,我是 NiFi 无所不能的真正拥护者。我在生产中创建了许多流程,但从未检查过流程中的流程计时。

我找到了一个解决方案,但它看起来像一个 hack

${now():toNumber():minus(${DATA_START:format('yyyy-MM-dd HH:mm:ss'):toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}):divide(1000)}

出于某种原因,NiFi 认为之前保存的 now() 不是数据。我将它转换为字符串,然后将其转换回日期,最后,我可以获得时间戳。时间戳可以被操纵,这就是我所需要的。

${DATA_START:format('yyyy-MM-dd HH:mm:ss'):toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}