7.5.5 调度器组件
MySQL Enterprise Edition中包括scheduler
组件。要了解更多关于商业产品,请见https://www.mysql.com/products/。
scheduler
组件提供了mysql_scheduler
服务的实现,使得应用程序、组件或插件可以配置、运行和取消任务,每N
秒。例如,audit_log
服务器插件在初始化时调用scheduler
组件,并配置了定期、重复的内存缓存刷新(见Enabling the Audit Log Flush Task)。
-
目的:实现
component_scheduler.enabled
系统变量,该变量控制调度器是否正在执行任务。在启动时,scheduler
组件注册了performance_schema.component_scheduler_tasks
表,该表列出了当前排定的任务和每个任务的运行数据。 -
URN:
file://component_sheduler
安装指南,请见Section 7.5.1, “Installing and Uninstalling Components”。
scheduler
组件使用以下元素实现服务:
-
一个优先队列,包含已注册、不活动的排定任务,按下一个任务的执行时间排序(升序)。
-
一个已注册、活动任务的列表。
-
一个背景线程:
-
如果没有任务或当前任务需要更多时间,它睡眠。它周期性地检查是否需要结束。
-
编译一个任务列表,移动它们从不活动队列到活动队列,然后执行每个任务。
-
执行任务列表后,移除任务从活动列表,添加到不活动列表,并计算下一个执行时间。
-
当调用者调用mysql_scheduler.create()
服务时,它创建了一个新的排定任务实例,并将其添加到队列中,信号背景线程的信号。返回给调用者的任务句柄。调用代码应该保留这个句柄和服务引用,直到调用mysql_scheduler.destroy()
服务。调用者在调用destroy()
时,传入之前从create()
接收的句柄,服务等待任务变为不活动(如果正在运行),然后从不活动队列中移除它。
组件服务在同一个调度线程中调用每个应用程序提供的回调(函数指针),按升序顺序执行,每个任务的执行时间。
想要将调度队列功能集成到应用程序、组件或插件中的开发者,请查看MySQL源代码分发中的mysql_scheduler.h
文件。