Quartz.NET 2.0学習ノート(5):インスタンス作成Windowsサービス実装タスクスケジューリング

50435 ワード

Quartz.NETプロジェクトアドレスhttp://quartznet.sourceforge.net/
Quartz.NET 2.0学習ノート(1):Quartz.NETの概要

Quartz.NET 2.0学習ノート(2):1.0とは若干異なる点
Quartz.NET 2.0学習ノート(3):プロファイルによるタスクスケジューリング
Quartz.NET 2.0学習ノート(4):cron式
Quartz.NET 2.0学習ノート(5):インスタンス作成Windowsサービス実装タスクスケジューリング
 
通常のWindowsサービスを使用してQuartzを作成する.Netサービス項目
  • まずQuartzを作成する.Net.2.0ソリューション、Windowsサービス項目の追加、インストーラの追加、サービス実行アカウントタイプの変更(デフォルトはUser)
  • C 5を追加する.dll、Common.Logging.dll、Common.Logging.Log4Net.dll、log4net.dll、Quartz.dllはC 5を参照する.dll 1つのC#と他のCLI言語の汎用集合クラス..Net2.0以上で使用できます.紹介住所:http://www.itu.dk/research/c5/Common.Logging.dll共通ログインタフェースCommon.Logging.Log4Net.dllはlog 4 net対汎用ログインタフェース(Common.Logging)の実現log 4 netを提供する.dllシロは
  • を説明しないことを知っています.
  • quartzを追加する.ファイルNetのプロファイルを設定し、コンパイル時に出力ディレクトリに生成して常にコピーする
  • Windowsサービスファイル上でコードを右クリックし、Quartzサービス起動コードを作成し、OnStart、OnStop、OnPause、OnContinueメソッドを書き換え、それぞれISchedulerのStart、Shutdown、PauseAll、ResumeAllメソッドに対応し、詳細はコードを参照


    QuartzService.cs
    using System.ServiceProcess;
    
    using Common.Logging;
    
    using Quartz.Impl;
    
    
    
    namespace Quartz.Net.Service
    
    {
    
        public partial class QuartzService : ServiceBase
    
        {
    
            private readonly ILog logger;
    
            private IScheduler scheduler;
    
    
    
            public QuartzService()
    
            {
    
                InitializeComponent();
    
                logger = LogManager.GetLogger(GetType());
    
                ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
    
                scheduler = schedulerFactory.GetScheduler();
    
            }
    
    
    
            protected override void OnStart(string[] args)
    
            {
    
                scheduler.Start();
    
                logger.Info("Quartz      ");
    
            }
    
    
    
            protected override void OnStop()
    
            {
    
                scheduler.Shutdown();
    
                logger.Info("Quartz      ");
    
            }
    
    
    
            protected override void OnPause()
    
            {
    
                scheduler.PauseAll();
    
            }
    
    
    
            protected override void OnContinue()
    
            {
    
                scheduler.ResumeAll();
    
            }
    
          
    
        }
    
    }

     

  • これでQuarzt.NetのWindowsサービスは正常に作成され、次にIJobインタフェースQuartzタスクを実現しました
  • Quartzを追加する.Net.Demoクラスライブラリプロジェクト
  • Commonを追加します.Logging.dll、log4net.dll、Quartz.dllの参照(実際のプロジェクトではCommon.Logging.dllとlog 4 net.dllのいずれかを参照してください.ここではプレゼンテーションに必要です)
  • DemoJob 1を追加する.cs,IJobインタフェースを実現し,ログ記録はCommonを用いる.Loggingインタフェース


    DemoJob1.cs
    using System;
    
    
    
    namespace Quartz.Net.Demo
    
    {
    
        /// <summary>
    
        ///   IJob  
    
        /// </summary>
    
        public class DemoJob1 : IJob
    
        {
    
            //  Common.Logging.dll          
    
            private static readonly Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
            #region IJob   
    
    
    
            public void Execute(IJobExecutionContext context)
    
            {
    
                try
    
                {
    
                    logger.Info("DemoJob1       ");
    
    
    
                    for (int i = 0; i < 10; i++)
    
                    {
    
                        logger.InfoFormat("DemoJob1     {0}", i);
    
                    }
    
    
    
                    logger.Info("DemoJob1      ");
    
                }
    
                catch (Exception ex)
    
                {
    
                    logger.Error("DemoJob2     ", ex);
    
                }
    
    
    
            }
    
    
    
            #endregion
    
        }
    
    }

     
  • DemoJob 2を追加する.cs、IJobインタフェースを実現し、ログ記録はlog 4 netを使用する


    DemoJob2.cs
    using System;
    
    
    
    namespace Quartz.Net.Demo
    
    {
    
        /// <summary>
    
        ///   IJob  
    
        /// </summary>
    
        public class DemoJob2 : IJob
    
        {
    
            //  log4net.dll          
    
            private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
            #region IJob   
    
    
    
            public void Execute(IJobExecutionContext context)
    
            {
    
                try
    
                {
    
                    logger.Info("DemoJob2       ");
    
    
    
                    for (int i = 0; i < 10; i++)
    
                    {
    
                        logger.InfoFormat("DemoJob2     {0}", i);
    
                    }
    
    
    
                    logger.Info("DemoJob2      ");
    
                }
    
                catch (Exception ex)
    
                {
    
                    logger.Error("DemoJob2     ", ex);
    
                }
    
    
    
            }
    
    
    
            #endregion
    
        }
    
    }

     
  • quartzを追加jobs.xml(スケジューリングタスクの構成)


    quartz_jobs.xml
    <?xml version="1.0" encoding="UTF-8"?>
    
    
    
    <!-- This file contains job definitions in schema version 2.0 format -->
    
    
    
    <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
    
    
    
      <processing-directives>
    
        <overwrite-existing-data>true</overwrite-existing-data>
    
      </processing-directives>
    
    
    
      <schedule>
    
        <!--      1 Job-->
    
        <job>
    
          <name>DemoJob1</name>
    
          <group>DeomJobGroup</group>
    
          <description>Quartz.Net    1</description>
    
          <job-type>Quartz.Net.Demo.DemoJob1,Quartz.Net.Demo</job-type>
    
          <durable>true</durable>
    
          <recover>false</recover>
    
        </job>
    
    
    
        <!--      2 Job-->
    
        <job>
    
          <name>DemoJob2</name>
    
          <group>DeomJobGroup</group>
    
          <description>Quartz.Net    2</description>
    
          <job-type>Quartz.Net.Demo.DemoJob2,Quartz.Net.Demo</job-type>
    
          <durable>true</durable>
    
          <recover>false</recover>
    
        </job>
    
    
    
        <!--      1      30     DemoJob1  -->
    
        <trigger>
    
          <cron>
    
            <name>DemoJob1Trigger</name>
    
            <group>DeomJobTriggerGroup</group>
    
            <job-name>DemoJob1</job-name>
    
            <job-group>DeomJobGroup</job-group>
    
            <cron-expression>0/30 * * * * ?</cron-expression>
    
          </cron>
    
        </trigger>
    
    
    
        <!--      2            DemoJob2  -->
    
        <trigger>
    
          <cron>
    
            <name>DemoJob2Trigger1</name>
    
            <group>DeomJobTriggerGroup</group>
    
            <job-name>DemoJob2</job-name>
    
            <job-group>DeomJobGroup</job-group>
    
            <cron-expression>0 * * * * ?</cron-expression>
    
          </cron>
    
        </trigger>
    
    
    
        <!--      2         01:00    DemoJob2  -->
    
        <trigger>
    
          <cron>
    
            <name>DemoJob2Trigger2</name>
    
            <group>DeomJobTriggerGroup</group>
    
            <job-name>DemoJob2</job-name>
    
            <job-group>DeomJobGroup</job-group>
    
            <cron-expression>0 0 1 * * ?</cron-expression>
    
          </cron>
    
        </trigger>
    
      </schedule>
    
    </job-scheduling-data>

     
  • appを修正する.config,配置Common.logging、log4net


    app.config
    <?xml version="1.0"?>
    
    <configuration>
    
      <configSections>
    
        <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    
        <sectionGroup name="common">
    
          <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
    
        </sectionGroup>
    
      </configSections>
    
      <common>
    
        <logging>
    
          <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net">
    
            <arg key="configType" value="INLINE"/>
    
          </factoryAdapter>
    
        </logging>
    
      </common>
    
      <log4net>
    
        <appender name="InfoFileAppender" type="log4net.Appender.RollingFileAppender">
    
          <file value="log/" />
    
          <appendToFile value="true" />
    
          <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
    
          <rollingStyle value="Date" />
    
          <maxSizeRollBackups value="100" />
    
          <maximumFileSize value="1024KB" />
    
          <staticLogFileName value="false" />
    
          <Encoding value="UTF-8" />
    
          <filter type="log4net.Filter.LevelRangeFilter">
    
            <param name="LevelMin" value="INFO" />
    
            <param name="LevelMax" value="INFO" />
    
          </filter>
    
          <layout type="log4net.Layout.PatternLayout">
    
            <conversionPattern value="%date %-5level %logger  - %message%newline" />
    
          </layout>
    
        </appender>
    
        <appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender">
    
          <file value="log/error.txt" />
    
          <appendToFile value="true" />
    
          <rollingStyle value="Size" />
    
          <maxSizeRollBackups value="100" />
    
          <maximumFileSize value="10240KB" />
    
          <staticLogFileName value="true" />
    
          <Encoding value="UTF-8" />
    
          <filter type="log4net.Filter.LevelRangeFilter">
    
            <param name="LevelMin" value="WARN" />
    
            <param name="LevelMax" value="FATAL" />
    
          </filter>
    
          <layout type="log4net.Layout.PatternLayout">
    
            <conversionPattern value="%date %-5level %logger - %message%newline" />
    
          </layout>
    
        </appender>
    
        <root>
    
          <level value="INFO" />
    
          <appender-ref ref="InfoFileAppender" />
    
          <appender-ref ref="ErrorFileAppender" />
    
        </root>
    
      </log4net>
    
    
    
      <!-- 
    
        We use quartz.config for this server, you can always use configuration section if you want to.
    
        Configuration section has precedence here.  
    
      -->
    
      <!--
    
      <quartz >
    
      </quartz>
    
      -->
    
      <startup>
    
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    
      </startup>
    
    </configuration>

     

  • Quartz.Net.サービスとQuartzNet.Demoはすべて作成した後、コンパイルを行い、私たちが作成したQuartzサービスをシステムのサービスに追加します.
  • コンパイルされた次のファイルをD:QuartzServices
  • にコピー
  • コンソールでは、sc create QuartzService binpath=D:QuartzServiceQuartz.Net.Service.exe完了サービス作成
  • QuartzServicesサービスを開始すると、D:QuartzServicesのログファイルに次のような出力が表示されます.


    View Code
    2012-04-15 08:10:28,391 INFO  Quartz.Impl.StdSchedulerFactory  - Quartz.NET properties loaded from configuration file 'D:\QuartzService\quartz.config'
    
    2012-04-15 08:10:28,438 INFO  Quartz.Impl.StdSchedulerFactory  - Using default implementation for object serializer
    
    2012-04-15 08:10:28,478 INFO  Quartz.Impl.StdSchedulerFactory  - Using default implementation for ThreadExecutor
    
    2012-04-15 08:10:28,498 INFO  Quartz.Core.SchedulerSignalerImpl  - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
    
    2012-04-15 08:10:28,498 INFO  Quartz.Core.QuartzScheduler  - Quartz Scheduler v.2.0.0.400 created.
    
    2012-04-15 08:10:28,502 INFO  Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin  - Registering Quartz Job Initialization Plug-in.
    
    2012-04-15 08:10:28,517 INFO  Quartz.Simpl.RAMJobStore  - RAMJobStore initialized.
    
    2012-04-15 08:10:28,540 INFO  Quartz.Simpl.RemotingSchedulerExporter  - Registering remoting channel of type 'System.Runtime.Remoting.Channels.Tcp.TcpChannel' to port (555) with name (httpQuartz)
    
    2012-04-15 08:10:28,540 INFO  Quartz.Simpl.RemotingSchedulerExporter  - Remoting channel registered successfully
    
    2012-04-15 08:10:28,541 INFO  Quartz.Simpl.RemotingSchedulerExporter  - Successfully marhalled remotable scheduler under name 'QuartzScheduler'
    
    2012-04-15 08:10:28,543 INFO  Quartz.Core.QuartzScheduler  - Scheduler meta-data: Quartz Scheduler (v2.0.0.400) 'ServerScheduler' with instanceId 'NON_CLUSTERED'
    
      Scheduler class: 'Quartz.Core.QuartzScheduler' - access via remote incovation.
    
      NOT STARTED.
    
      Currently in standby mode.
    
      Number of jobs executed: 0
    
      Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 10 threads.
    
      Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
    
    
    
    2012-04-15 08:10:28,543 INFO  Quartz.Impl.StdSchedulerFactory  - Quartz scheduler 'ServerScheduler' initialized
    
    2012-04-15 08:10:28,543 INFO  Quartz.Impl.StdSchedulerFactory  - Quartz scheduler version: 2.0.0.400
    
    2012-04-15 08:10:28,554 INFO  Quartz.Xml.XMLSchedulingDataProcessor  - Parsing XML file: D:\QuartzService\quartz_jobs.xml with systemId: ~/quartz_jobs.xml
    
    2012-04-15 08:10:28,930 INFO  Quartz.Xml.XMLSchedulingDataProcessor  - Adding 2 jobs, 3 triggers.
    
    2012-04-15 08:10:28,933 INFO  Quartz.Xml.XMLSchedulingDataProcessor  - Adding job: DeomJobGroup.DemoJob1
    
    2012-04-15 08:10:28,937 INFO  Quartz.Xml.XMLSchedulingDataProcessor  - Adding job: DeomJobGroup.DemoJob2
    
    2012-04-15 08:10:28,997 INFO  Quartz.Core.QuartzScheduler  - Scheduler ServerScheduler_$_NON_CLUSTERED started.
    
    2012-04-15 08:10:28,997 INFO  Quartz.Net.Service.QuartzService  - Quartz      
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1       
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     0
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     1
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     2
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     3
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     4
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     5
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     6
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     7
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     8
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     9
    
    2012-04-15 08:10:30,041 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1      
    
    2012-04-15 08:11:00,002 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1       
    
    2012-04-15 08:11:00,002 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     0
    
    2012-04-15 08:11:00,002 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     1
    
    2012-04-15 08:11:00,002 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     2
    
    2012-04-15 08:11:00,002 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     3
    
    2012-04-15 08:11:00,002 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     4
    
    2012-04-15 08:11:00,003 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     5
    
    2012-04-15 08:11:00,003 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     6
    
    2012-04-15 08:11:00,003 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     7
    
    2012-04-15 08:11:00,003 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     8
    
    2012-04-15 08:11:00,003 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     9
    
    2012-04-15 08:11:00,003 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1      
    
    2012-04-15 08:11:00,003 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2       
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     0
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     1
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     2
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     3
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     4
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     5
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     6
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     7
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     8
    
    2012-04-15 08:11:00,004 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2     9
    
    2012-04-15 08:11:00,005 INFO  Quartz.Net.Demo.DemoJob2  - DemoJob2      
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1       
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     0
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     1
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     2
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     3
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     4
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     5
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     6
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     7
    
    2012-04-15 08:11:29,999 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     8
    
    2012-04-15 08:11:30,000 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1     9
    
    2012-04-15 08:11:30,000 INFO  Quartz.Net.Demo.DemoJob1  - DemoJob1      
    
    2012-04-15 08:11:32,607 INFO  Quartz.Core.QuartzScheduler  - Scheduler ServerScheduler_$_NON_CLUSTERED shutting down.
    
    2012-04-15 08:11:32,608 INFO  Quartz.Core.QuartzScheduler  - Scheduler ServerScheduler_$_NON_CLUSTERED paused.
    
    2012-04-15 08:11:32,611 INFO  Quartz.Simpl.RemotingSchedulerExporter  - Successfully disconnected remotable scheduler
    
    2012-04-15 08:11:32,612 INFO  Quartz.Core.QuartzScheduler  - Scheduler ServerScheduler_$_NON_CLUSTERED Shutdown complete.
    
    2012-04-15 08:11:32,612 INFO  Quartz.Net.Service.QuartzService  - Quartz      

     

  • ログの記録には必要に応じてCommonを使用できます.loggingまたはlog 4 net、Quartzのためです.Netで使用するCommon.loggingのlog 4 netは実現するので、この2つのdllを同時に参照する必要があります.具体的なプロジェクトでは、この2つのいずれかを参照する効果は同じです(log 4 netを使用する前提で)
    ソースファイルダウンロード:Quartz-2.0Demo.rar
    PS:
    Quartzが起動した後、サービスを閉じる時にタイムリーに閉じることができなくて、プロセスを殺さなければならなくて、解決方法の時にShutdownメソッドを呼び出す時パラメータfalseに入って、つまり任務の運行が終わるのを待たないですぐに閉じる
    scheduler.Shutdown(false);