关于Quartz的一些经历

  两年前,刚到公司接触了Quartz.对它好奇不已,有不少疑问和好奇

于是乎问我们老大:他是怎么实现的?

       老大说:是用底层线程做的

就没有然后了,我当时决定要下载源码来看看,不信看不懂!

https://github.com/quartznet/quartznet

Ok,万事具备开始下断点调试

过了一会,断点呢?于是第一次宣布放弃

时间过了一年。。。。。。

我以为我已经够能看懂这个开源项目的地步了,正好当时需要基于此开发一个可持续的,自动化的,可配置的Job运行站点

通过AppDomain的简单加载,卸载进行实现,最后是完成了

去年和前年一样,下断点,调试,最终还是把断点丢了。不同的是去年多丢了几次。。。

时间到了今年,是时候了结了!!

断点还是要的。

最终是这么来的:

1.使用红门(Red Gate)的性能测试工具 ANTS附加进程跟踪,分两步,1是启动时,2是启动后,

  哈哈,启动的执行步骤在ANTS下只剩一条内裤

  启动后调度器调度的过程更是内裤都没了

2.有了执行过程那下起断点来,哪里不会点哪里,

  1.启动时主要工作:初始化调度器-》初始化调度器线程,并开始跑内部是Thread.同时初始化配置或者默认的10个线程的自定义线程池(两个回路链表,一个是空闲链表,一个是繁忙链表),每个线程While(True),确实是这样的

  2.启动完成后,代码会调研ScacheduleJob,这是是将任务,触发器存储至RamJobStore(一种存储方式)

  3.之后调度器线程通过存储的触发器计算将要执行的Job,如果有的话通过JobRunShellFactory创建JobRunShell,其实就是实例化我们实现的IJob的类,以及其他一些信息。

  4.调度器线程调用线程池执行任务方法,获取空闲链表的第一个,加入到繁忙链表中,并关联上刚刚获取到的IJob实例。

  5.空闲工作线程一直在While(true),当调用了这个方法后

SimpleThreadPool.cs的Run方法

WorkerThread类的Run方法

将直接开跑,执行我们的任务。

以上是花了一下午的结果,当然还有很多其他内容。包括它的抽象反射工程模式,以及我吐槽它的一些命名,还有对Thread的掌控,是学习Thread的不错的开源项目

不止想和大家分享下QuartzC#的实现,还有就是这个过程,希望能让自己少走弯路,从大方向入手或许能更有效的掌控和了解全局

时间: 2024-10-25 18:23:59

关于Quartz的一些经历的相关文章

(5)Quartz学习

原文:http://blog.csdn.net/zxl315/article/details/10879927 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行. 运行环境 Quartz 能嵌入在其他应用程序里运行. Quartz 能在一个应用服务器里被实例化(或servlet容器), 并且参与XA事务 Quartz能独立运行(通过JVM),或者通过RMI Quartz能被集群实例化 任务调度 当一个指定给任务的触发器发生时,任务就被调度执行. 触发器能被创建为

Java EE学习——Quartz的Cron表达式

经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比如我们想设定淘宝“秒杀”的那一秒时间,完全可以用下面的方法设置执行时间. Calendar cal = Calendar.getInstance(); //设置将要发生的时间... cal.set(Calendar.DATE, xxx); //.......常规的生成scheduler和job //

Quartz.NET配置

Quartz.NET 是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等. 首先看一下简单的quartz_jobs.xml示例 <?xml version="1.0" encoding="UTF-8"

记录一次ceph recovery经历

一次ceph recovery经历 背景 这是一个测试环境. 该环境中是cephfs 一共12个节点, 2个client.2个mds.8个osd mds: 2颗CPU,每个4核,一共是8核. 128G内存, 单独的两个节点,只作为mds cpu型号: Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz osd节点, 每个24核, 8 × 4T SATA盘, 1 SSD:INTEL SSD SC2BB48 (480G) 64G内存 cpu型号: Intel(R) X

quartz入门

quartz有两个重要对象,作业JobDetail和触发器Trigger,它们是多对多的关系 作业 JobDetail JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJob.class) .withIdentity("testJob_1", "group_1") .build(); 触发器 Trigger,Quartz有两大触发器,SimpleTrigger和CronTrigger Trigger trigge

Spring quartz定时任务service注入问题

今天想单元测试一下spring中的quartz定时任务,一顿折腾,到最后总是发现job类里注入的service为null.一开始还以为spring的配置问题,各种找原因,最后还是确定是没有注入. 就去网上搜搜吧.也找出来一些眉目.简单的理解这个原因是job是在quartz中实例化出来的,不受spring的管理.所以就导致注入不进去了.参考这个文章 http://www.tuicool.com/articles/Qjyamu 找着试试的态度,就按照文章里说的.new一个类 public class

Spring中使用Quartz

package com.ncs.hj; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import java.util.Date; public class SpringQtz { private static int counter = 0; protected

任务调度框架-Quartz.Net

使用Quartz.Net依赖于以下3个组件:Common.Logging.dll.Common.Logging.Core.dll.Quartz.dll 简单封装 1 using Quartz; 2 using Quartz.Impl; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 na

Quartz.NET简介及入门指南

Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAVA开源调度框架 Quartz 的移植. 入门指南 本入门指南包括以下内容: 下载 Quartz.NET 安装 Quartz.NET 根据你的特定项目配置 Quartz 启动一个样例程序 下载和安装 你可以下载 zip 文件或使用 Nuget 程序包.Nuget 程序包只包含 Quartz.NET 运