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
これで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
DemoJob 2を追加する.cs、IJobインタフェースを実現し、ログ記録はlog 4 netを使用する
DemoJob2.cs
quartzを追加jobs.xml(スケジューリングタスクの構成)
quartz_jobs.xml
appを修正する.config,配置Common.logging、log4net
app.config
Quartz.Net.サービスとQuartzNet.Demoはすべて作成した後、コンパイルを行い、私たちが作成したQuartzサービスをシステムのサービスに追加します.コンパイルされた次のファイルをD:QuartzServices にコピーコンソールでは、sc create QuartzService binpath=D:QuartzServiceQuartz.Net.Service.exe完了サービス作成 QuartzServicesサービスを開始すると、D:QuartzServicesのログファイルに次のような出力が表示されます.
View Code
ログの記録には必要に応じて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に入って、つまり任務の運行が終わるのを待たないですぐに閉じる
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サービス項目
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タスクを実現しました
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
}
}
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
<?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
<?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".txt"" />
<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サービスをシステムのサービスに追加します.
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);