NIFI源码学习-(二)处理器执行与调度

通过 NIFI源码学习-(-)处理器启动 我们知道了处理器在启动时候,会把一个执行处理器 onTrigger 方法的线程对象加入了线程池中,本文讲下任务是如何调度的

一、源码分析

 在处理器启动过程中,调用完OnScheduled方法完之后,会执行这样一个方法,注解的意思是由 StandardProcessScheduler 提供的回调,用于启动组件的 onTrigger() 循环,跟进去:

进入到 doschedule

这是个抽象类,进入 TimerDrivenSchedulingAgent 实现类:(这个版本的事件驱动不稳定,暂时先不管)

 两个红框的内容,就是处理器启动时候提到的,创建一个执行ontrigger方法的线程对象,并加入入线程池当中。

进入 createTrigger 方法

要执行invoke方法,跟进去,别的先不管,

这个  onTrigger 方法是正经执行我们要做的任务的

每个处理器都继承自 Processor 类,并实现 onTrigger 方法,并在其中实现各个处理器自己的功能。

因此线程池 flowEngine  中的线程,总会通过执行 invoke 方法,触发处理器的 onTrigger 方法,进而实现对流文件的处理。

二、invoke 详探

进入这个方法,首先会通过  isWorkToDo 来判断当前处理器,有没有任务要做,

可以看到,不同的组件类型,甚至有不同连接关系的处理器都有不同的判断逻辑,同时漏斗这个组件,也是参与调度的。细节这里暂不做深究。

invoke方法,继续往下走

通过注释大致猜测,是当满足某些条件的时候,启动背压,不再执行处理器的处理任务。其实进入到  isRelationshipAvailabilitySatisfied 方法可以看到,当某个关系的所有连接都不是自循环且有非空连接的时候,关系处于可用状态,返回true,否则返回false。没有可用连接的时候,处理器不再处理流文件。

invoke方法,继续往下走

 这里对应的是页面上设置的处理器运行是低延迟还是高性能。当页面上往右调整处理器调度页面的 Run duration 的时候,batchNanos就不为0。

此时会记录一个开始时间 startNanos,在此值的基础上,加上 batchNanos记录为 finishNanos。并有一个while循环,在循环中,会调用一次处理器的 onTrigger 方法,调用完成,获取当前时间,与 finishNanos 比较。当超过它的时候,while循环结束。以此来提升处理器的处理速度。

invoke方法是有返回值的,当invoke执行到 !isWorkToDo  判断处理器有没有任务需要做并返回false的时候,方法返回 InvocationResult.yield("No work to do"),方法回到

并继续往下走,

 noWorkYieldNanos 是配置文件中配置的无任务处理时线程的阻塞时间,默认是10毫秒

所以,当处理器使用默认的时间间隔也就是0秒时,有任务的时候,加入线程池中的线程可以一直被调度运行。当检测不到处理任务时,线程会被重新设置为10毫秒运行一次以检测当前有无任务需要处理。

三、flowEngine

 通过查找该构造方法的使用地方,可以在 FlowController 构造的时候找到:

 

 

 通过java自带的虚拟机可视化程序,当NIFi启动的时候,可以看到虚拟机中名字前缀为 Timer-Driven Process 的线程。可以看到线程池的大小,受页面上右上controllerSet中最大Timer-Drive线程大小的限制。

 

四、小结

当启动处理器的时候,会向 ScheduledExecutorService 线程池中提交 Concurrent tasks 个任务到 线程池当中,默认执行间隔是0,。当线程检测到空闲时,每个任务会被调整为都会隔10毫秒执行一次,每次执行,都会检测有没有任务要做。当检测到有任务需要执行的时候,就会执行处理器的 onTrigger 方法。线程池的大小,受 Maximum timer driven thread count 配置的控制。

可以想见,处理器会启动很多个,每个处理器又配置有不同的并发数。所以线程池中中会出现提交了很多个任务的情况。因为 Run duration 配置项的存在,当线程池中的某个线程发现有任务要做,同时 Run duration 不为0,线程就会在while循环中,在Run duration配置的时间内不会进行线程池的任务切换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值