明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

Quartz 线程处理

Posted on 2015-08-29 23:05  且行且思  阅读(2730)  评论(0编辑  收藏  举报

官网

http://www.quartz-scheduler.net/

相关的 Log 说明

http://netcommon.sourceforge.net/docs/2.1.0/reference/html/index.html

 

博客园友>> 懒惰的肥兔  (他写不少相关的文章,值得一读)

http://www.cnblogs.com/lzrabbit/archive/2012/04/15/2448326.html

 

 

有很多人问Quartz启动后,关闭服务时无法及时关闭,必须杀进程才可以,解决方法时在调用Shutdown方法时传入参数false,即不等待任务运行结束立即关闭

scheduler.Shutdown(false);

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

Quartz.net  2.0 版本有个地方特别需要注意; 在 App.config 里的 factoryAdapter不再是Log4Net取而代之的是Log4Net1211;

<logging>
      <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1211">
        <arg key="configType" value="INLINE"/>
      </factoryAdapter>
    </logging>

 

Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。

有一个属性可以变更默认

    //串行执行的属性。
 [Quartz.DisallowConcurrentExecution]
    public class IJob : Quartz.IJob
    {
        public void Execute(Quartz.IJobExecutionContext context)
        {
}
}

 

@DisallowConcurrentExecution

此标记用在实现Job的类上面,意思是不允许并发执行,按照我之前的理解是 不允许调度框架在同一时刻调用Job类,后来经过测试发现并不是这样,而是Job(任务)的执行时间[比如需要10秒]大于任务的时间间隔 [Interval(5秒)],那么默认情况下,调度框架为了能让 任务按照我们预定的时间间隔执行,会马上启用新的线程执行任务。否则的话会等待任务执行完毕以后 再重新执行!(这样会导致任务的执行不是按照我们预先定义的时间间隔执行)

设定的时间间隔为3秒,但job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行,否则会在3秒时再启用新的线程执行