自定义等待处理器创建了过多的日志

时间:2019-01-24 06:47:44

标签: apache-nifi

我创建了一个自定义日志处理器。我曾经使用“惩罚期限”来等待。

以下是我实现此目的的代码。处理器按预期方式工作。但是运行时,我可以看到生成了许多日志。我可以看到日志一直在打印“ 流文件为空(错误)!!! ”。一个简单的解决方案是注释掉日志,但是仍然调用处理器很多次。不过,我一直会这样,如果我增加 yield 的值,处理器就会在那么长的间隔内被调用。

所以我的问题是,如何减轻对CPU的压力并减少调用onTrigger方法的时间。

@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
    final ComponentLog logger = getLogger();
    FlowFile flowFile = session.get();
    if (flowFile != null) {
        logger.info("flow file is not null.");
        String state = flowFile.getAttribute("_wait_state");
        if (state == null || state.isEmpty()) {
            logger.info("\"_wait_state\" attribute is missing, going into WAIT.");
            flowFile = session.putAttribute( flowFile, "_wait_state", "1");
            flowFile = session.penalize(flowFile);
            context.yield();//to save CPU cycles....
            session.transfer( flowFile, POINT_TO_SELF_RELATIONSHIP );
        } else {
            logger.info("\"_wait_state\" attribute is available, breaking WAIT.");
            flowFile = session.removeAttribute( flowFile, "_wait_state" );
            session.transfer( flowFile, SUCCESS_RELATIONSHIP); 
        }
    } else {
        logger.info("flow file is null (bad)!!!.");
    }
}

enter image description here

1 个答案:

答案 0 :(得分:2)

处理器获取空流文件是正常的,这可能由于两个原因而发生...

1)处理器配置了多个并发任务,并且框架检测到传入队列中存在流文件,因此安排处理器运行,然后其中一个任务获取该流文件,另一个任务转到执行,没有流文件。

2)处理器具有@TriggerWhenEmpty批注,该批注将覆盖上述行为,并始终执行处理器,而不管流文件是否在队列中。

大多数处理器使用类似以下的命令启动onTrigger:

FlowFile flowFile = session.get();
if (flowFile == null) {
  return;
}