Camel FTP Component中的任务调度实现原理

Camel FTP Component中的任务调度实现原理

之前我们介绍了Task Scheduler实现剖析Spring如何实现Quartz的自动配置。今天介绍一下再Camel的FtpComponent组件中是如何实现任务调度的,如果有了以上两篇文章做基础,下面的内容将会非常简单了。

Camel可以通过配置endpoint实现对FTP服务器的定时扫描,以下述endpoint举例:

ftp://[email protected]:2000/po?disconnect=true&
	autoCreate=false&
	charset=UTF-8&
	password=RAW(password)&
	stepwise=true&
	connectTimeout=60000&
	soTimeout=60000&
	maximumReconnectAttempts=3&
	reconnectDelay=5000&
	scheduler=quartz&
	scheduler.cron=0+0/5+*+*+*+?+*&
	localWorkDirectory=/work/directory&
	pollStrategy=#ftpPollingStrategy

其中重点留意以下两个参数,这两个参数的意思是使用Quartz任务调度,使用cron触发器,每5分钟执行一次任务。

	scheduler=quartz
	scheduler.cron=0+0/5+*+*+*+?+*

那么Camel是如何将这两个endpoint的配置项转换为具体的QuartzScheduler的呢?

我们知道Camel的endpoint可以创建consumer和producer。对FTP component来说,FTP consumer即从FTP服务器读取文件,而FTP producer则是上传文件到FTP服务器。FTP上传往往由外部事件触发,因此不需要定时器,而FTP consumer则需要通过定时器实现定时扫描功能。

通过下面的核心类图,我们可以看到FtpEndpoint继承了ScheduledPollEndpoint,而上述的scheduler和scheduler.cron都是ScheduledPollEndpoint的配置参数,那么我们先从ScheduledPollEndpoint入手。
在这里插入图片描述

URL -> Endpoint

在将URL转换为ScheduledPollEndpoint对象时会调用configureProperties方法,可以看到根据scheduler的不同值会走不同的逻辑,主要支持none(default)、spring、quartz三种设置,今天我们重点看一下quartz是如何实现的。

org.apache.camel.support.ScheduledPollEndpoint#configureProperties
在这里插入图片描述
scheduler的值为quartz时主要做了一件事,就是创建了org.apache.camel.pollconsumer.quartz.QuartzScheduledPollConsumerScheduler对象。

QuartzScheduledPollConsumerScheduler其实是一个代理类,它负责将实际的调度传递给QuartzScheduler调度器。

在这里插入图片描述

Endpoint -> Consumer

在FtpEndpoint创建FtpConsumer阶段,会调用doConfigureConsumer方法将ScheduledPollEndpoint的属性值传递给ScheduledPollConsumer。其中包括scheduler(QuartzScheduledPollConsumerScheduler对象)和schedulerProperties(QuartzScheduledPollConsumerScheduler对象的属性配置)。schedulerProperties可以通过URL进行配置:

&schedulerProperties.triggerId=TRIGGER-001

org.apache.camel.support.ScheduledPollEndpoint#doConfigureConsumer
在这里插入图片描述

启动Consumer阶段

在FtpConsumer的启动阶段会调用ScheduledPollConsumer的doStart方法,其中主要是针对scheduler属性(QuartzScheduledPollConsumerScheduler对象)的一些操作。包括设置scheduler属性值,初始化QuartzScheduler,调度任务等。

org.apache.camel.support.ScheduledPollConsumer#doStart
在这里插入图片描述
下面我们重点看一下QuartzScheduler的初始化过程,我们看到QuartzScheduler是通过QuartzComponent创建的,其具体创建过程可参考Camel Quartz Component创建QuartzScheduler的过程

org.apache.camel.pollconsumer.quartz.QuartzScheduledPollConsumerScheduler#doStart
在这里插入图片描述
创建完QuartzScheduler后,如果没有设置triggerId,则随机生成一个新的triggerId,并查看QuartzScheduler中是否存在该trigger。
如果trigger不存在创建job,创建trigger,开启调度。
在这里插入图片描述
如果trigger已存在,更新job信息,创建trigger,如果触发器发生改变则重新调度任务,否则正常开启调度;
在这里插入图片描述
本文从核心类图、URL-Endpoint、Endpoint-Consumer、Consumer启动等几个阶段介绍了Camel FTP Component组件实现任务调度的原理,并简要介绍了Quartz Component的配置和启动过程。需要注意的是Camel Quartz Component创建QuartzScheduler的过程Spring如何实现Quartz的自动配置的方式并不相同,在开发过程中需要注意。

猜你喜欢

转载自blog.csdn.net/ttyy1112/article/details/129758567
今日推荐