这两天摸索了一下Windows服务调用quartz.net,在这里分享一下下,欢迎同学们给建设性的意见。
还是先大概介绍下quartz.net:
你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用.NET编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz.NET调度器。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等
以上介绍是从博客园张善友(http://www.cnblogs.com/shanyou/archive/2007/08/25/quartznettutorial.html)的博客摘抄来的,具体了解quartz.net还是到他的宝地学习,我这里只大概讲怎么应用。
这边博文还会用到log4net ,如果过不太了解log4net 可以到(http://blog.csdn.net/zhoufoxcn/article/details/2220533)来了解下。
这里对windows服务也是有一定要求的。
我在这里只讲对以上技术的应用,需要注意的地方我会重点提及,但不会对具体的原理做进一步解释。毕竟牵扯到的知识点不少,我只能笼统的讲解。
开始吧:
1,打开vs2010--新建项目--选择"Windows服务",我这里命名为"JobSchedulerTest". 创建好后首先映入我们眼帘的是Service1.cs[设计]视图,右键点设计视图选择"添加安装程序",如下图:
注释:(创建一个Windows服务,仅用InstallUtil程序去安装这个服务是不够的。你必须还要把一个服务安装程序添加到你的Windows服务当中,这样便于InstallUtil或是任何别的安装程序知道应用你服务的是怎样的配置设置)
2, 切换到刚被添加的ProjectInstaller的设计视图, 设置serviceInstaller1组件的属性: StartType = Automatic; 设置serviceProcessInstaller1组件的属性 Account = LocalSystem; 如下图:
3,JobSchedulerTest中添加Quartz.dll ,log4net.dll引用,在Services.cs文件中引用命名空间 Quartz;Quartz.Impl; log4net;
如下图,会报错,别急:
右键点击JobSchedulerTest项目,属性-目标框架 ,选择.net Framwork 4,如下图:
4,添加log4net.config配置文件,具体配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<root>
<level value="ALL" />
</root>
<!-- job日志 -->
<logger name="Job.Status">
<level value="INFO" />
<appender-ref ref="Job.StatusAppender" />
</logger>
<appender name="Job.StatusAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="Logs\\Status\\" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy-MM\\"Status-"yyyy-MM-dd".txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} %m%n" />
</layout>
</appender>
<!-- job日志 -->
<!-- 服务错误日志 -->
<logger name="Service.Error">
<level value="INFO" />
<appender-ref ref="Service.ErrorAppender" />
</logger>
<appender name="Service.ErrorAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="Logs\\Error\\" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy-MM\\"ServiceError-"yyyy-MM-dd".txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} %m%n" />
</layout>
</appender>
<!-- 服务错误日志 -->
</log4net>
</configuration>
以上配置了记录日志的目录文件名(<param name="File" value="Logs\\Error\\" />)、txt命名样式(yyyy-MM\\"ServiceError-"yyyy-MM-dd".txt) 等信息。
具体介绍还是google吧?我对log4net认识也只局限于部分应用。
5,在解决方案中添加新项-选择"类库",我这里命名为JobLibrary,JobLibrary用来实现多个"作业"类。JobLibrary类库中添加Quartz.dll ,log4net.dll引用。
JobLibrary类库中添加一个类JobBase.cs,代码如下:
JobLibrary类库中再分别添加两个"作业"类test1.cs,test2.cs:
代码如下,因为只是个测试,所以我这里两个类方法几乎没多大区别:
test1.cs
test2.cs
6,在JobSchedulerTest中引用JobLibrary
回到JobSchedulerTest中,添加配置文件JobScheduler.config,配置信息如下:
对于上面的理解要看看quartz的教程。
7.将log4net.config和JobScheduler.config配置文件复制到JobSchedulerTest.exe
服务应用程序所在的目录下。我的目录如下(D:\JobSchedulerTest\JobSchedulerTest\bin\Debug)
生成解决方案。
8,注册windows服务:
cmd打开命令行工具:
如果你系统是C盘,一般命令应该如下:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "你的windows服务路径"
我的win7系统装在F盘所以命令如下:
F:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe D:\JobSchedulerTest\JobSchedulerTest\bin\Debug\JobSchedulerTest.exe
反注册如下:
F:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u D:\JobSchedulerTest\JobSchedulerTest\bin\Debug\JobSchedulerTest.exe
这样注册就完了。
9,打开服务:
运行 下输入services.msc打开服务管理。如图:
或者 计算机-管理-服务和应用程序-服务 。刷新。可以查看到service1.如下图:
启动serivce1.
10 回到windows服务 应用程序所在目录,我的为:D:\JobSchedulerTest\JobSchedulerTest\bin\Debug\
你会发现多了个文件夹logs,logs里面还包括Error和Status文件夹。打开Status文件夹发现今天的日志文件夹,再打开发现今天的日志文件Status-2011-08-09.txt
上面的文件配置来自步骤4 。如果你了解log4net那就一目了然了。 在Status-2011-08-09.txt日志文件中,test1比test2出现的次数多? 这是因为在JobScheduler.config
的配置中 test1作业2分钟调用一次,test2作业5分钟调用一次。(expression="0 0/2 * * * ?" ) 这个学习quartz了,呵呵
大体就这样 ,多提宝贵意见,我是菜鸟很多地方还不懂。
转自http://www.cnblogs.com/zhangzhi19861216/archive/2011/08/09/2132036.html