我创建了一个自定义日志处理器。我曾经使用“惩罚期限”来等待。
以下是我实现此目的的代码。处理器按预期方式工作。但是运行时,我可以看到生成了许多日志。我可以看到日志一直在打印“ 流文件为空(错误)!!! ”。一个简单的解决方案是注释掉日志,但是仍然调用处理器很多次。不过,我一直会这样,如果我增加 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)!!!.");
}
}
答案 0 :(得分:2)
处理器获取空流文件是正常的,这可能由于两个原因而发生...
1)处理器配置了多个并发任务,并且框架检测到传入队列中存在流文件,因此安排处理器运行,然后其中一个任务获取该流文件,另一个任务转到执行,没有流文件。
2)处理器具有@TriggerWhenEmpty批注,该批注将覆盖上述行为,并始终执行处理器,而不管流文件是否在队列中。
大多数处理器使用类似以下的命令启动onTrigger:
FlowFile flowFile = session.get();
if (flowFile == null) {
return;
}