Quartz.NET学习系列(十一)--- Quartz.NET持久化及客户端服务器模式

持久化

        Quartz.NET如果不进行数据库相关配置,则默认的执行模式为内存模式,优点是执行速度快,确定就是数据无法存储,宕机了需要重新开始。

持久化只需要做如下配置(以SQLServer为例)

            NameValueCollection properties = new NameValueCollection();
            //存储类型
            properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
            //表明前缀
            properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
            //驱动类型
            properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
            //数据源名称
            properties["quartz.jobStore.dataSource"] = "myDS";
            //连接字符串
            properties["quartz.dataSource.myDS.connectionString"] = @"Data Source=(local);Initial Catalog=quartz;User ID=sa;Password=123";
            //sqlserver版本
            properties["quartz.dataSource.myDS.provider"] = "SqlServer-20";

客户端服务器模式

Quartz.NET支持TCP的通信,所以可以有这样的架构场景:用服务器承载持久化下来的所有任务并持续执行,想添加任务可通过客户端管理工具来向服务器数据库添加任务(当然是调用Quartz.NET框架里的方法),这样就可以产生了任务调度服务。

服务器代码例子:

        public class RemoteServerExample
	{
		public static void Run()
		{
			ILog log = LogManager.GetLogger(typeof(RemoteServerExample));

                        NameValueCollection properties = new NameValueCollection();
                        <span style="font-family: Arial, Helvetica, sans-serif;">properties["quartz.scheduler.instanceName"] = "RemoteServer";</span>

                        properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
                        properties["quartz.threadPool.threadCount"] = "5";
                        properties["quartz.threadPool.threadPriority"] = "Normal";

                        // 设置服务器
                        properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
                        properties["quartz.scheduler.exporter.port"] = "555";
                        properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
                        properties["quartz.scheduler.exporter.channelType"] = "tcp";
                        properties["quartz.scheduler.exporter.channelName"] = "httpQuartz";
                        // 拒绝远程
                        //properties["quartz.scheduler.exporter.rejectRemoteRequests"] = "true";

                        //存储类型
                        properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
                        //表明前缀
                        properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
                        //驱动类型
                        properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
                        //数据源名称
                        properties["quartz.jobStore.dataSource"] = "myDS";
                        //连接字符串
                        properties["quartz.dataSource.myDS.connectionString"] = @"Data Source=(local);Initial Catalog=quartz;User ID=sa;Password=123";
                        //sqlserver版本
                        properties["quartz.dataSource.myDS.provider"] = "SqlServer-20";

                        ISchedulerFactory sf = new StdSchedulerFactory(properties);
                        IScheduler sched = sf.GetScheduler();
			sched.Start();

			log.Info("------- 服务器启动 -----------------");
			Thread.Sleep(TimeSpan.FromMinutes(5));
                        //sched.Shutdown(true);
                        log.Info("------- 服务器关闭 -----------------");

			SchedulerMetaData metaData = sched.GetMetaData();
			log.Info("执行次数 " + metaData.NumberOfJobsExecuted );
		}

	}

客户端代码例子

    [PersistJobDataAfterExecution]
    [DisallowConcurrentExecution]
    public class SimpleJob : IJob
    {
        public const string Message = "msg";
        private static readonly ILog log = LogManager.GetLogger(typeof (SimpleJob));

        public virtual void Execute(IJobExecutionContext context)
        {
            JobKey jobKey = context.JobDetail.Key;
            string message = context.JobDetail.JobDataMap.GetString(Message);
            log.InfoFormat("{0} 执行时间 {1}", jobKey, DateTime.Now.ToString());
            log.InfoFormat("msg: {0}", message);
        }
    }

    public class RemoteClientExample
    {
        public static void Run()
        {
            ILog log = LogManager.GetLogger(typeof (RemoteClientExample));

            NameValueCollection properties = new NameValueCollection();
            properties["quartz.scheduler.instanceName"] = "RemoteClient";

            // 设置线程池
            properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
            properties["quartz.threadPool.threadCount"] = "5";
            properties["quartz.threadPool.threadPriority"] = "Normal";

            // 设置远程连接
            properties["quartz.scheduler.proxy"] = "true";
            properties["quartz.scheduler.proxy.address"] = "tcp://127.0.0.1:555/QuartzScheduler";

            ISchedulerFactory sf = new StdSchedulerFactory(properties);
            IScheduler sched = sf.GetScheduler();

            IJobDetail job = JobBuilder.Create<SimpleJob>()
                .WithIdentity("remotelyAddedJob", "default")
                .Build();

            JobDataMap map = job.JobDataMap;
            map.Put("msg", "信息");

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("remotelyAddedTrigger", "default")
                .ForJob(job.Key)
                .WithCronSchedule("/5 * * ? * *")
                .Build();
            sched.ScheduleJob(job, trigger);

            log.Info("向服务器添加计划任务");
        }

        public string Name
        {
            get { return null; }
        }
    }

服务器如果是单机运行的话,一旦宕机就可能会出现业务问题,所以Quartz.NET提供了集群配置,这将在下一篇学习。

时间: 2024-08-05 15:51:42

Quartz.NET学习系列(十一)--- Quartz.NET持久化及客户端服务器模式的相关文章

Quartz.NET学习系列

Quartz.NET是一个开源的任务调度引擎,对于周期性的任务,持续性的任务提供了很好的支持,并支持持久化,集群等功能.一下是我这个对于Quartz.NET的学习记录: 源码下载地址http://yunpan.cn/cZcHVh7W3SB3X  访问密码d45a 由于博客编辑器的问题,部分代码可能显示不完全,可点击 这个按钮来获取完整的源码 Quartz.NET学习系列(一)--- 快速入门 Quartz.NET学习系列(二)--- 简单触发器 Quartz.NET学习系列(三)--- Cron

Quartz.NET学习系列(九)--- XML任务配置

Quartz.NET除了可以代码定义触发器.任务之外,还可以由XML定义这两个对象.其实Quartz.NET的理想架构是:计划管理容器作为服务器运行在服务机上,而触发器.任务的添加可通过自定义任务管理软件向服务器上添加特定的任务计划. 这时就要求数据的持久化以及服务器的容错性了,后面几篇文章将会介绍持久化以及集群相关内容. VS的XML只能提示 第一篇已经将Quartz.NET下载过来了,在路径doc/xml/文件加下可以找到job_scheduling_data_2_0.xsd vs的智能提示

Quartz.NET学习系列(十二)--- Quartz.NET集群

Quartz.NET提供了集群的配置,这个集群并不能达到负载均衡的效果,而仅仅提供了故障转移的功能,主要场景是:两个节点的Quartz.NET任务服务器同时连接到另一个节点的数据库服务器,当一个任务服务器宕机时,另一个任务服务器会启动. 集群的主要配置如下: properties["quartz.jobStore.clustered"] = "true"; 总的代码如下: [PersistJobDataAfterExecution] [DisallowConcurr

FineBI学习系列之FineBI官网提供的服务器数据集(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-30.html 目录: 1.描述 2.设计器远程连接方法及步骤 3.服务器数据集建立步骤 4.服务器数据集使用方法 1.描述 在前面章节中我们介绍了如何通过BI的数据连接功能来连接要访问的数据库,具体见 这一节介绍如何使用服务器数据集.与数据库数据集不同,服务器数据集是不随数据连接的变化而变化的,这些数据存储在BI的服务器中的

Quartz.NET学习系列(一)--- 快速入门

Quartz.NET是一个任务调度的开源框架,官网地址是http://www.quartz-scheduler.net/index.html 帮助文档地址是http://www.quartz-scheduler.net/documentation/index.html 目前Quartz.NET的最新版本是2.3.1,本系列以后的文章都是基于这个版本的.先从官网下载2.3.1版本的rar,可在rar目录Src/Quartz.Examples下找到官方提供的一系列的例子,包括触发器操作,任务中断,数

Quartz.NET学习系列(八)--- 任务监听器

Quartz.NET提供了触发器监听接口.任务监听接口.计划监听接口,基本上不怎么使用,除了任务监听接口有使用场景外,其它的监听器目前还未找到使用场景. 任务监听接口需要继承自IJobListener,应用场景可以是:执行完一个任务,自动切换执行另一个任务. 具体代码如下: public class SimpleJob1 : IJob { private ILog log = LogManager.GetLogger(typeof(SimpleJob1)); public virtual voi

Quartz.NET学习系列(三)--- Cron触发器

Cron触发器是使用Cron表达式来配置任务的时间的. Cron表达式介绍 Cron表达式总共有7个值,其中一个可选,具体如下(摘自官方文档): 值 是否必须 允许的值范围 允许的字符 Seconds YES 0-59 , - * / Minutes YES 0-59 , - * / Hours YES 0-23 , - * / Day of month YES 1-31 , - * ? / L W Month YES 1-12 or JAN-DEC , - * / Day of week YE

hadoop 入门学习系列十一----hue安装

1. hue整体架构 2.解压hue 3.安装依赖 yum install gmp-devel 4. 编译 make apps 5.修改hue的配置文件 desktop/conf/hue.ini 6.启动hue 7.Hue与hadoop集成 在hadoop的core-site.xml里增加配置 <property> <name>hadoop.proxyuser.hue.hosts</name> <value>*</value> </prop

MVC3+EF4.1学习系列(十一)----EF4.1常见的问题解决

博客写了10篇了~有很多朋友私信问了一些问题,而且很多问题 大家问的都一样 这里说说这些常见问题的解决办法.如果大家有更好的解决办法~也希望分享出来 问题大概为这几个 一.ef4.1 codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题. 二.ef4.1 没有了edmx等复杂的东西 变得简单 干净  但如何使用存储过程,存储过程可以返回表 可以返回数值 也有可能是执行修改 删除 增加等  该怎么做? 三.ef4.1 如何使用数据库视图?每个视图都