基于开源框架Quartz.net打造,废话不多说,上代码
第一步:搭建服务器端
1.新建控制台项目,使用代码完成配置(如果你想方便修改,可以使用quartz的xml配置,都是支持的)
NuGet搜索quartz,topshelf和log4net安装下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static NameValueCollection GetConfig() { NameValueCollection kvp = new NameValueCollection(); //存储类型 kvp["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"; //表明前缀 kvp["quartz.jobStore.tablePrefix"] = "QRTZ_"; //驱动类型 kvp["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"; //数据源名称 kvp["quartz.jobStore.dataSource"] = "myDS"; //连接字符串 kvp["quartz.dataSource.myDS.connectionString"] = @"Data Source=xxx.xxx.xxx.xxx;Initial Catalog=dbName;User ID=xx;Password=xx"; //sqlserver版本 kvp["quartz.dataSource.myDS.provider"] = "SqlServer-20"; //cluster集群配置 //kvp["quartz.jobStore.clustered"] = "true"; //kvp["quartz.scheduler.instanceId"] = "AUTO"; //kvp["quartz.scheduler.proxy"] = "true"; //kvp["quartz.scheduler.proxy.address"] = "tcp://127.0.0.1:555/QuartzScheduler"; kvp["quartz.scheduler.instanceName"] = "RemotesServer"; kvp["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; kvp["quartz.threadPool.threadCount"] = "5"; kvp["quartz.threadPool.threadPriority"] = "Normal"; kvp["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz"; kvp["quartz.scheduler.exporter.port"] = "555"; kvp["quartz.scheduler.exporter.bindName"] = "QuartzScheduler"; kvp["quartz.scheduler.exporter.channelType"] = "tcp"; kvp["quartz.scheduler.exporter.channelName"] = "httpQuartz"; kvp["quartz.scheduler.exporter.rejectRemoteRequests"] = "false"; return kvp; }
第二步:集成topshelf
主要是为了安装成windows服务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class SrvRunner:ServiceControl, ServiceSuspend { private readonly IScheduler scheduler; public SrvRunner() { var properties = QzConfigs.GetConfig(); var schedulerFactory = new StdSchedulerFactory(properties); scheduler = schedulerFactory.GetScheduler(); } public bool Start(HostControl hostControl) { scheduler.Start(); return true; } public bool Stop(HostControl hostControl) { scheduler.Shutdown(false); return true; } public bool Continue(HostControl hostControl) { scheduler.ResumeAll(); return true; } public bool Pause(HostControl hostControl) { scheduler.PauseAll(); return true; } }
第三步:业务代码(job)开发
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[Description("TestJob示例")] public class TestJob: IJob { private readonly ILog _logger = LogManager.GetLogger(typeof(TestJob)); public void Execute(IJobExecutionContext context) { _logger.InfoFormat("TestJob测试"); } }
第四步:配置log4net来输出log(appender 配置如下)
<!-- 控制台前台显示日志 --> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <mapping> <level value="ERROR" /> <foreColor value="Red, HighIntensity" /> </mapping> <mapping> <level value="Info" /> <foreColor value="Green" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Info" /> <param name="LevelMax" value="Fatal" /> </filter> </appender>
直接启动即可已控制套方式运行服务器,手工build一个任务实例进去,效果如下
如果想安装成windows服务,也是可以的,直接install就行
至此,服务器端已经搭建完成了