介绍
这篇文章给大家介绍如何掌握Quartz.net分布式定时任务的姿势,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
<节>引言
长话短说,今天聊一聊分布式定时任务,我的流水账笔记:
- <李> <节> ASP。网络核心+ Quartz.Net实现网络定时任务
,,
节> 李> <李> <节> AspNetCore结合复述,实践消息队列 ,,
节> 李>
细心朋友稍一分析,就知道还有问题:
水平扩展后的WebApp的Quartz.net定时任务会多次触发,因为WebApp实例使用的是默认的<代码> RAMJobStore> 代码,多实例在内存中都维护了工作和触发的副本。
我的定时任务是同步任务,多次执行倒是没有太大问题,但对于特定业务的定时任务,多次执行可能是致命问题。
引用>基于此,来看看Quartz.net分布式定时任务的姿势
,AdoJobStore
很明显,水平扩展的多实例需要一个独立于web实例的机制来存储工作和扳机。
Quartz.net提供ADO。净JobStore来存储任务数据。
<李> <节>先使用SQL脚本在数据库中生成指定的表结构节> 李>
执行脚本之后,会看到数据库中多出几个以QRTZ_开头的表
引用><李> <节>配置Quartz.net使用AdoJobStore 节> 李>
可采用编码形式或者quartz.config形式添加配置
引用>,快速实践
,1。预先生成工作,触发器表
从https://github.com/quartznet/quartznet/tree/master/database/tables下载合适的数据库表脚本,生成指定的表结构
,2。添加AdoJobStore
本次使用编码方式添加AdoJobStore配置。
首次启动会将代码中工作和触发持久化到sqlite,后面就直接从sqlite中加载工作和触发<代码>使用系统;使用System.Collections.Specialized
,
使用System.Data;使用System.Threading.Tasks
,
使用Microsoft.Data.Sqlite;使用Microsoft.Extensions.Logging
,
使用石英;使用Quartz.Impl
,
使用Quartz.Impl.AdoJobStore.Common;使用Quartz.Spi
,
名称空间EqidManager
{
,,使用IOCContainer=IServiceProvider;
,,公开课QuartzStartup
,,{
,,,,公共IScheduler调度器{得到;设置;}
,,,,私人只读的ILogger实例_logger;
,,,,私人只读的IJobFactory iocJobfactory;
,,,,公共QuartzStartup (IOCContainer IOCContainer, ILoggerFactory loggerFactory)
,,,,{
,,,,,,_logger=loggerFactory.CreateLogger();
,,,,,,iocJobfactory=new iocJobfactory (IocContainer);
,,,,,,DbProvider.RegisterDbMetadata (“sqlite-custom"新DbMetadata ()
,,,,,,{
,,,,,,,,AssemblyName=typeof (SqliteConnection) .Assembly.GetName ()。名字,
,,,,,,,,ConnectionType=typeof (SqliteConnection),
,,,,,,,,CommandType=typeof (SqliteCommand),
,,,,,,,,ParameterType=typeof (SqliteParameter),
,,,,,,,,ParameterDbType=typeof (DbType),
,,,,,,,,ParameterDbTypePropertyName=癉bType",
,,,,,,,,ParameterNamePrefix=癅",
,,,,,,,,ExceptionType=typeof (SqliteException),
,,,,,,,,BindByName=true
,,,,,,});
,,,,,,var属性=new NameValueCollection
,,,,,,{
,,,,,,,,(“quartz.jobStore.type")=癚uartz.Impl.AdoJobStore。JobStoreTX Quartz",
,,,,,,,,(“quartz.jobStore.useProperties")=皌rue",
,,,,,,,,(“quartz.jobStore.dataSource")=癲efault",
,,,,,,,,(“quartz.jobStore.tablePrefix")=癚RTZ_",
,,,,,,,,(“quartz.jobStore.driverDelegateType")=癚uartz.Impl.AdoJobStore。SQLiteDelegate Quartz",
,,,,,,,,(“quartz.dataSource.default.provider")=皊qlite-custom",
,,,,,,,,(“quartz.dataSource.default.connectionString")=?EqidManager.db"数据来源,
,,,,,,,,(“quartz.jobStore.lockHandler.type")=癚uartz.Impl.AdoJobStore。UpdateLockRowSemaphore Quartz",
,,,,,,,null null null如何掌握Quartz.net分布式定时任务的姿势