.Net Core 2.0 的 ConsoleApp 搭建 Quartz(xml配置)windows服務

来源:https://www.cnblogs.com/Cowait/archive/2018/06/01/9121205.html
-Advertisement-
Play Games

零、創建一個.Net Core 2.0 的ConsoleApp 應用,建完就是這個樣子了。 添加Log4Net 的引用,(不想看可以不看,個人習慣)Install-Package log4net添加Config文件夾往文件夾裡面添加Log4net.xml(別忘記了設置Copy always)添加Lo ...


零、創建一個.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     }
Log4netConfig

 

在Main函數加下麵幾行代碼

1 Environment.CurrentDirectory = AppContext.BaseDirectory;
2 Log4NetConfig.DefalutConfig();
3 var logger = LogManager.GetLogger(typeof(Program));
4 logger.Info("服務開始");
Main

 

得到的差不多就是這樣了

運行下,可以看到日誌基本就沒錯了。

 

一、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     }
HostService

 

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();
Main

 

這個時候,運行,服務就可以啟動了。

大概就是這麼個效果



二、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     }
TestQuartzService

 

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     }
TestJob

 

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
quartz.config

 

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>
quartz_job

 

 

 

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     }
HostService

 

 

 

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。
到這就弄完了。有什麼問自己,翻源碼去吧


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.新建web項目,添加兩個Button控制項,結果如圖。 2.Button按鈕控制項點擊事件代碼如下 點擊Button1控制項: 可以看到動態生成的文本框的值成功獲取到。 但是點擊Button2會出現如下結果: 原因是因為動態生成的文本框其實是HTML控制項,所以獲取文本框的值 控時,要註意獲取的方法,不 ...
  • 基於ASP.NET 4.0開發的開源微商城系統,我們的目標是構建一個核心完善而又輕量級的微商城平臺,目前基本的核心功能,包括微信登陸/支付,產品管理,購物車與訂單管理等,輕量級是為了更加便於理解源碼和二次開發。 使用技術 ASP.NET 4.0 MySql Server 環境要求 支持ASP.NET ...
  • 一、如要使用SQLite,可以從Visual Studio中的“程式包管理器控制台”輸入以下命令完成安裝: SQLite則會安裝到項目中,支持32位或64位,如下圖所示: 二、新建一個SQLite資料庫,名稱命名為Test.db,其表名稱及列定義如下: 三、新建一個控制台應用的解決方案,並輸入以下代 ...
  • 今天看到 叫我藍火火 s的 UWP中實現大爆炸效果(一) ,我也來說一下我的app 【小薇自然語言處理】實現的大爆炸技術。 看一下效果先。 我的控制項是基於wrappanel的,正如藍火火說的,這樣看來是很整齊,他不喜歡這樣的。不過我倒是覺得還行。哈哈😂 程式員也是眾口難調,哈 大爆炸技術主要分為兩 ...
  • 一直不清楚服務端是如何判斷一個請求是否是ajax請求,通過ILSpy查看,才得知是通過判斷請求頭是否存在 X-Requested-With:XMLHttpRequest 來判斷是否是ajax請求。 ...
  • 讀【C#併發編程經典實例.PDF】一書總結: 1、併發:同時做多件事。 2、多線程:併發的一種形式,它採用多個線程來執行程式。所以多線程只是實現併發的一種方法,併發不等於多線程。 3、並行處理:把正在執行的大量任務分隔成小塊,分配給多個正在運行的線程。 並行處理是多線程的一種,多線程是併發的一種。 ...
  • 原文:https://www.codeproject.com/articles/85296/important-uses-of-delegates-and-events 原文作者: Shivprasad koirala 介紹 在這篇文章中, 我們會嘗試著去理解delegate能解決什麼樣的問題, 然 ...
  • 我們利用LoadRunner可以對Web應用系統進行性能壓力測試,本篇博客將和大家介紹下LoadRunner 12的下載和安裝,在後續的博客中將和大家介紹其使用的方法。 1、LoadRunner 12.02下載地址:https://pan.baidu.com/s/1nuEE4Jn#list/path ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...