文章转载授权级别:B
无论是 Quartz.net 还是 MySql.Data 都是我们比较熟悉的库了,Quartz.net 如果配置为使用 MySql 数据库做持久化时,默认是硬编码了使用 MySql.Data 来操作 MySql 数据库的。下面是我的一些个人诉求和实践,和大家共同探讨一下。
0x01 为什么要替换 MySql.Data
MySql.Data 虽然是官方驱动,但实际上实现质量并不是很高。我和一些朋友都经历过在使用它做长时间的连接查询时异常崩溃,在 老农 菊巨 的推荐以后,我一直使用 MySqlConnector 这个 MySql 驱动。
因为我的项目都是使用了 MySqlConnector 这个驱动,此驱动为了兼容官方的写法,类名和命名空间基本保持一致,这就导致如果你同时引用这两个库后,再想创建 MySqlConnection 对象时,编译器无法识别到底是哪一个程序集的类型。
因此如果你项目中已经使用了 MySqlConnector,那么最好还是替换掉 Quarzt.net 默认使用的驱动。
0x02 测试 Quartz.net 使用 MySql.Data
在本地 MySql 数据库中创建测试数据库 quartz, 并通过执行脚本 https://raw.githubusercontent.com/dotnetcore/DotnetSpider/master/src/DotnetSpider.Portal/DDL/MySql.sql 来创建所需要的表
首先创建一个空的 Console 项目并添加 Quartz 这个包
修改 Program.cs 代码如下
class Program { public class HelloJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} Greetings from HelloJob!"); return Task.CompletedTask; } } static async Task Main(string[] args) {
IScheduler scheduler = null; try {
var properties = new NameValueCollection {
{
"quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"}, {
"quartz.jobStore.dataSource", "myDs"}, {
"quartz.serializer.type", "binary"}, {
"quartz.dataSource.myDs.provider", "MySql"}, {
"quartz.dataSource.myDs.connectionString", "Database='quartz';Data Source=localhost;password=1qazZAQ!;User ID=root;Port=3306;" } }; scheduler = await new StdSchedulerFactory(properties).GetScheduler(); await scheduler.Start(); if (!await scheduler.CheckExists(new JobKey("job1", "group1"))) {
var trigger = TriggerBuilder.Create().WithCronSchedule("*/5 * * * * ?").WithIdentity("trigger1") .Build(); var job = JobBuilder.Create().WithIdentity("job1", "group1") .RequestRecovery(true).Build(); await scheduler.ScheduleJob(job, trigger); } Console.Read(); } finally {
if (scheduler != null) {
await scheduler.Shutdown(); } } } }
直接运行可以发现程序异常退出了,异常信息如下:
Unhandled Exception: Quartz.SchedulerException: Could not Initialize DataSource: myDs ---> System.ArgumentException: Error while reading metadata information for provider 'MySql'
Parameter name: providerName ---> Quartz.SchedulerConfigExcept