何时在 NiFi 处理器中使用 session.commit()

When to session.commit() in a NiFi Processor

我正在实施 NiFi 处理器,并且有几个关于最佳实践的澄清:

  1. session.getProvenanceReporter().modify(...) - 我们是否应该在每个 session.transfer()
  2. 之后立即发出事件
  3. session.commit() - 文档说,在对流文件执行操作后,可以调用提交或回滚。

开发者指南:https://nifi.apache.org/docs/nifi-docs/html/developer-guide.html#process_session

问题是,如果不显式调用这些方法,我会失去什么?

1) 是的,通常在传输流文件后发出来源事件。

2) 这取决于您是扩展 AbstractProcessor 还是 AbstractSessionFactoryProcessor。 AbstractProcessor 将为您调用提交或回滚,因此您不需要,AbstractSessionFactoryProcessor 需要您适当地调用它们。

如果您正在扩展 AbstractSessionFactoryProcessor 并且从不调用提交,最终该会话将被垃圾收集并调用回滚,并且该会话执行的所有操作都将被回滚。

还有一个注解@SupportsBatching 可以放在处理器上。当此注释存在时,UI 会在处理器的调度选项卡上显示一个滑块,指示可以在幕后将多少毫秒的框架操作(如 commit())一起批处理以提高吞吐量。如果延迟更重要,那么将幻灯片保留在 0 毫秒是合适的,但这里的关键是用户在构建流程和配置处理器时可以决定这一点。