我如何在Nifi中重置等待通知计数器

时间:2019-02-13 10:49:56

标签: apache-nifi

我有一个流程,每次必须等待确切的12个文件。

所以我写了

这样的代码

getHDFS->通知->等待->一些处理。

通知具有以下配置

Release Signal Identifier = eredee_45rgfyWQQWQ
Signal Counter Name = cntr_for_run
Signal Counter Delta = 1
Signal Buffer Count = 1

等待具有以下配置

Release Signal Identifier = eredee_45rgfyWQQWQ
Target Signal Count = 12
Signal Counter Name = cntr_for_run
Wait Buffer Count = 1
Releasable FlowFile Count = 1

这是第一次工作,并且仅在总读取为12时才释放文件,但是一旦第13个文件到来,它就会过去。我希望它以这种方式工作,以便下一次在总数为24时等待释放文件(我的意思是下一个12个文件)。如何将运行计数器重置为零?

3 个答案:

答案 0 :(得分:1)

我还没有尝试过,但是您可以尝试使用PutDistributedMapCache处理器为您在Wait / Notify中使用的信号标识符的缓存键设置一个空值。

或者,您可以以某种方式为每一批文件生成一个新的发布信号标识符,并在Notify和Wait处理器中使用表达式语言来引用动态值,而不是对标识符进行硬编码。

答案 1 :(得分:0)

  

一个值,或“属性表达式语言”语句的结果,   它将根据FlowFile进行评估,以确定   信号计数器增量。指定计数器应增加多少。   例如,如果在上游流处理了多个信号事件   以批处理方式,可以通知已处理事件的数量   立即具有此属性。零(0)具有特殊含义,它会清除   目标计数回到0,与Wait一起使用时特别有用   可释放FlowFile Count =零(0)模式,以提供   “开闭门”类型的流量控制。一(1)可以打开一个   相应的等待处理器,零(0)可以将其取反,就好像关闭   一扇门。

Signal Counter Delta处理器的Notify属性的描述。) 因此,您只需将计数器增量设置为零,然后将其触发即可。

此外,尝试使用UpdateAttribute并每12个流文件更新一个计数器。

UpdateAttribute:有状态变量的初始值= 1 商店状态= Store State Locally count = ${getStateValue("count"):equals(13):ifElse('1', ${getStateValue("count"):plus(1)}}

=> RouteOnAttribute: 验证= ${count:equals(13)}

Matched =>使用“通知”(如上所述)进行重置

Unmatched =>照常继续

不过,我确实要警告您,它只能在一个节点上运行(因为UpdateAttribute的状态存储在该节点上)

答案 2 :(得分:0)

我有同样的问题。解决的方法是:在属性等待过程中使用

  

属性复制模式=替换(如果存在)

在我看来,它仅在以下情况下起作用

  

替换(如果存在)=总计