我有一个流程,每次必须等待确切的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个文件)。如何将运行计数器重置为零?
答案 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)
我有同样的问题。解决的方法是:在属性等待过程中使用
属性复制模式=替换(如果存在)
在我看来,它仅在以下情况下起作用
替换(如果存在)=总计