.Net Core 2.0 的 ConsoleApp 搭建 Quartz(xml配置)windows服务
零、创建一个.Net Core 2.0 的ConsoleApp 应用,建完就是这个样子了。
添加Log4Net 的引用,(不想看可以不看,个人习惯)
Install-Package log4net
添加Config文件夹
往文件夹里面添加Log4net.xml(别忘记了设置Copy always)
添加Log4NetConfig.cs文件
往里面写几行代码
1 /// <summary> 2 /// log4net拓展 3 /// </summary> 4 public sealed class Log4netConfig 5 { 6 /// <summary> 7 /// 配置默认数据 8 /// </summary> 9 public static void DefalutConfig() 10 { 11 var defalutResposity = LogManager.GetRepository(Assembly.GetCallingAssembly()); 12 var path = Path.Combine(Directory.GetCurrentDirectory(), "Config", "Log4net.xml"); 13 XmlConfigurator.Configure(defalutResposity, new FileInfo(path)); 14 } 15 }
在Main函数加下面几行代码
1 Environment.CurrentDirectory = AppContext.BaseDirectory; 2 Log4NetConfig.DefalutConfig(); 3 var logger = LogManager.GetLogger(typeof(Program)); 4 logger.Info("服务开始");
得到的差不多就是这样了
运行下,可以看到日志基本就没错了。
一、windows服务的搭建
大概或许是看下了https://github.com/aspnet/Hosting/tree/dev/src/Microsoft.AspNetCore.Hosting,随便乱写的
1.引用
Install-Package System.ServiceProcess.ServiceController
Install-Package Install-Package System.Configuration.ConfigurationManager
2.添加appSettings.config
在Config文件夹下添加appSettings.config
添加内容
<appSettings> <!--服务名称--> <add key="ServiceName" value="MyTestService"/> </appSettings>
3.添加HostService.cs
然后写上如下代码
1 /// <summary> 2 /// 服务 3 /// </summary> 4 public class HostService : ServiceBase 5 { 6 private ILog Log = LogManager.GetLogger(typeof(HostService)); 7 8 /// <summary> 9 /// Creates an instance of <c>WebHostService</c> which hosts the specified web application. 10 /// </summary> 11 /// <param name="host">The configured web host containing the web application to host in the Windows service.</param> 12 public HostService() 13 { 14 } 15 16 public void Start() 17 { 18 Log.Info($"{base.ServiceName}服务开启"); 19 OnStart(null); 20 } 21 22 protected sealed override void OnStart(string[] args) 23 { 24 OnStarting(args); 25 //dosomthing 26 OnStarted(); 27 } 28 29 protected sealed override void OnStop() 30 { 31 Log.Info($"{base.ServiceName}服务关闭"); 32 OnStopping(); 33 try 34 { 35 } 36 finally 37 { 38 OnStopped(); 39 } 40 } 41 42 /// <summary> 43 /// Executes before ASP.NET Core starts. 44 /// </summary> 45 /// <param name="args">The command line arguments passed to the service.</param> 46 protected virtual void OnStarting(string[] args) { } 47 48 /// <summary> 49 /// Executes after ASP.NET Core starts. 50 /// </summary> 51 protected virtual void OnStarted() { } 52 53 /// <summary> 54 /// Executes before ASP.NET Core shuts down. 55 /// </summary> 56 protected virtual void OnStopping() { } 57 58 /// <summary> 59 /// Executes after ASP.NET Core shuts down. 60 /// </summary> 61 protected virtual void OnStopped() { } 62 }
4. Main 改为如下代码
1 var serviceName = ConfigurationManager.AppSettings["ServiceName"]; 2 var hostService = new HostService { ServiceName = serviceName }; 3 logger.Info("服务开始"); 4 #if DEBUG 5 //服务名称赋值 6 Console.WriteLine($"{serviceName}服务开启..."); 7 hostService.Start(); 8 9 Console.ReadKey(true); 10 hostService.Stop(); 11 Console.WriteLine($"{serviceName}服务停止"); 12 #else 13 logger.Info($"{serviceName}服务开启..."); 14 var servicesToRun = new ServiceBase[] { hostService }; 15 ServiceBase.Run(servicesToRun); 16 #endif 17 Console.ReadLine();
这个时候,运行,服务就可以启动了。
大概就是这么个效果
二、quart的使用
1.引用
添加引用
Install-Package Quartz
Install-Package Quartz.Plugins
2.添加TestQuartzService .cs 文件,写入以下代码
1 public class TestQuartzService : IDisposable 2 { 3 private ILog Log = LogManager.GetLogger(typeof(TestQuartzService)); 4 public List<IScheduler> Schedulers = new List<IScheduler>(); 5 public void Start() 6 { 7 Log.Info("quartz开启!"); 8 // 从工厂中获取调度程序实例 9 StdSchedulerFactory factory = new StdSchedulerFactory(); 10 IScheduler scheduler = factory.GetScheduler().Result; 11 Schedulers.Add(scheduler); 12 scheduler.Start(); 13 Log.Info("quartz开启完成!"); 14 } 15 16 public void Stop() 17 { 18 Log.Info("quartz关闭!"); 19 foreach (var scheduler in Schedulers) 20 { 21 scheduler.Shutdown().GetAwaiter().GetResult(); 22 } 23 Log.Info("quartz关闭完成!"); 24 } 25 26 public void Dispose() 27 { 28 foreach (var scheduler in Schedulers) 29 { 30 if (scheduler.IsStarted) 31 { 32 scheduler.Shutdown().GetAwaiter().GetResult(); 33 } 34 } 35 } 36 }
3.添加TestJob.cs文件
写入以下代码
1 public class TestJob : IJob 2 { 3 private ILog Log = LogManager.GetLogger(typeof(TestJob)); 4 public Task Execute(IJobExecutionContext context) 5 { 6 Log.Info("测试job启动"); 7 Console.WriteLine("测试job启动"); 8 return Task.CompletedTask; 9 } 10 }
4.添加 quartz.config
1 # You can configure your scheduler in either <quartz> configuration section 2 # or in quartz properties file 3 # Configuration section has precedence 4 5 quartz.scheduler.instanceName = ServerScheduler 6 7 # configure thread pool info 8 quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz 9 quartz.threadPool.threadCount = 10 10 quartz.threadPool.threadPriority = Normal 11 12 # job initialization plugin handles our xml reading, without it defaults are used 13 quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins 14 quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
5.添加quartz_jobs.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 3 <processing-directives> 4 <overwrite-existing-data>true</overwrite-existing-data> 5 </processing-directives> 6 <schedule> 7 <job> 8 <name>TestJob</name> 9 <group>TestJobGroup</group> 10 <description>测试Job</description> 11 <job-type>TestQuartzService.TestJob,TestQuartzService</job-type> 12 <durable>true</durable> 13 <recover>false</recover> 14 </job> 15 <trigger> 16 <cron> 17 <name>TestJobJobTrigger</name> 18 <group>TestJobTriggerGroup</group> 19 <job-name>TestJob</job-name> 20 <job-group>TestJobGroup</job-group> 21 <misfire-instruction>DoNothing</misfire-instruction> 22 <cron-expression>0/3 * * * * ?</cron-expression> 23 </cron> 24 </trigger> 25 </schedule> 26 </job-scheduling-data>
6.HostService.cs改为
1 /// <summary> 2 /// 服务 3 /// </summary> 4 public class HostService : ServiceBase 5 { 6 private ILog Log = LogManager.GetLogger(typeof(HostService)); 7 8 private TestQuartzService _testQuartzService; 9 /// <summary> 10 /// Creates an instance of <c>WebHostService</c> which hosts the specified web application. 11 /// </summary> 12 /// <param name="host">The configured web host containing the web application to host in the Windows service.</param> 13 public HostService() 14 { 15 _testQuartzService = new TestQuartzService(); 16 } 17 18 public void Start() 19 { 20 Log.Info($"{base.ServiceName}服务开启"); 21 OnStart(null); 22 } 23 24 protected sealed override void OnStart(string[] args) 25 { 26 OnStarting(args); 27 //dosomthing 28 _testQuartzService.Start(); 29 OnStarted(); 30 } 31 32 protected sealed override void OnStop() 33 { 34 Log.Info($"{base.ServiceName}服务关闭"); 35 OnStopping(); 36 try 37 { 38 _testQuartzService.Stop(); 39 } 40 finally 41 { 42 OnStopped(); 43 } 44 } 45 46 /// <summary> 47 /// Executes before ASP.NET Core starts. 48 /// </summary> 49 /// <param name="args">The command line arguments passed to the service.</param> 50 protected virtual void OnStarting(string[] args) { } 51 52 /// <summary> 53 /// Executes after ASP.NET Core starts. 54 /// </summary> 55 protected virtual void OnStarted() { } 56 57 /// <summary> 58 /// Executes before ASP.NET Core shuts down. 59 /// </summary> 60 protected virtual void OnStopping() { } 61 62 /// <summary> 63 /// Executes after ASP.NET Core shuts down. 64 /// </summary> 65 protected virtual void OnStopped() { } 66 }
6.尝试启动
三、安装为windows服务
1.编辑TestQuartzService.csproj
添加 <RuntimeIdentifier>win-x64-corert</RuntimeIdentifier>
2.Main的引用添加(不添加release会报错,因为使用了 var servicesToRun = new ServiceBase[] { hostService };)
using System.ServiceProcess;
3.点击发布
这下就会在 netcoreapp2.0\win-x64-corert 出现
有了这个exe就可以进行第四步了
4.管理员打开CMD
输入以下
sc create TestQuartzService binpath=E:\liuyue\TestQuartzService\TestQuartzService\bin\Release\netcoreapp2.0\win-x64-corert\TestQuartzService.exe
看到
5、打开服务找到
点启动
看到日志有日志不断输出
四、完结
值得注意一点就是,各种config、xml文件,记得copy always。
到这就弄完了。有什么问自己,翻源码去吧
上一篇: 不再孤单的光棍节 11•11手机促销盘点
下一篇: 第一章 pandas基础