scheduler
组件包含在 MySQL 企业版(一种商业产品)中。要了解有关商业产品的更多信息,请参阅 https://www.mysqlserver.cn/products/。
scheduler
组件提供了 mysql_scheduler
服务的实现,该服务使应用程序、组件或插件能够每 N
秒配置、运行和取消配置任务。例如,audit_log
服务器插件在其初始化时调用 scheduler
组件,并配置其内存缓存的定期、重复刷新(请参阅 启用审计日志刷新任务)。
目的:实现
component_scheduler.enabled
系统变量,该变量控制调度程序是否正在积极执行任务。在启动时,scheduler
组件注册performance_schema.component_scheduler_tasks
表,该表列出当前计划的任务以及每个任务的一些运行时数据。URN:
file://component_sheduler
有关安装说明,请参阅 第 7.5.1 节 “安装和卸载组件”。
scheduler
组件使用以下元素实现服务
按下次运行时间(升序)排序的已注册、非活动计划任务的优先级队列。
已注册、活动任务的列表。
后台线程
如果没有任务或顶级任务需要更多时间才能运行,则休眠。它会定期唤醒以检查是否该结束了。
编译需要运行的任务列表,将它们从非活动队列中移出,将它们添加到活动队列中,并单独执行每个任务。
执行任务列表后,从活动列表中删除任务,将它们添加到非活动列表中,并计算下次需要运行的时间。
当调用方调用 mysql_scheduler.create()
服务时,它会创建一个新的计划任务实例以添加到队列中,该队列会向后台线程的信号量发出信号。新任务的句柄将返回给调用方。调用代码应保留此句柄和对调度服务的引用,直到调用 mysql_scheduler.destroy()
服务之后。当调用方调用 destroy()
并传入从 create()
接收到的句柄时,服务将等待任务变为非活动状态(如果正在运行),然后将其从非活动队列中删除。
组件服务将每个应用程序提供的回调(函数指针)调用到同一个调度程序线程中,一次一个,并按升序排列,具体取决于每个回调需要运行的时间。
希望将调度程序排队功能合并到应用程序、组件或插件中的开发人员应查阅 MySQL 源代码发行版中的 mysql_scheduler.h
文件。