定時從列表中爬今日通知資訊,打包成windows服務
TopShelf概述
Topshelf是建立Windows服務的另一種方法,老外的一篇文章透過5個步驟詳細的介紹使用使用Topshelf建立Windows 服務。是一個開源的跨平臺的宿主服務框架,支援Windows和Mono,只需要幾行程式碼就可以構建一個很方便使用的服務宿主。
不瞭解TopShelf的童鞋可以先百度或者根據LZ提供的連結看看TopShelf是什麼以及如何使用。
在瞭解TopShelf為何物後,我們首先建立一個控制檯專案,將我們所需要的元件一一安裝。
Install-package Quartz.Net Install-package Log4Net Install-package HtmlAgility Install-package TopShelf
第一步:配置Log4Net日誌
新建Log4net.config配置檔案
<?xml version="1.0" encoding="utf-8" ?><configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日誌路徑--> <param name= "File" value= "D:App_Logservicelog"/> <!--是否是向檔案中追加日誌--> <param name= "AppendToFile" value= "true"/> <!--log保留天數--> <param name= "MaxSizeRollBackups" value= "10"/> <!--日誌檔名是否是固定不變的--> <param name= "StaticLogFileName" value= "false"/> <!--日誌檔名格式為:2008-08-31.log--> <param name= "DatePattern" value= "yyyy-MM-dd".read.log""/> <!--日誌根據日期滾動--> <param name= "RollingStyle" value= "Date"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" /> </layout> </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> <root> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <level value="all" /> <appender-ref ref="ColoredConsoleAppender"/> <appender-ref ref="RollingLogFileAppender"/> </root> </log4net></configuration>
image.png
在Main方法種開始執行時,對Log4Net進行日誌配置載入。
第二部:爬取資訊
使用HtmlAgility,如果對此第三方庫不是很理解的,可以參考LZ的爬蟲系列文章,裡面有對其講解。
程式碼不做過多講解,主要就是注意獲取當天資料
public class JKNews { /// <summary> /// 得到今日的新聞 /// </summary> /// <returns></returns> public static List<Notice> GetTodayNews() { string[] url = { "", "" }; var web = new HtmlWeb(); web.OverrideEncoding = Encoding.GetEncoding("gb2312"); List<Notice> noticeItems = new List<Notice>(); for (int i = 0; i < url.Length; i++) { var docWeb = web.Load(url[i]); var listItems = docWeb.DocumentNode.SelectNodes("//*[@id="table_list"]/li").ToList(); foreach (var item in listItems) { string href = item.SelectSingleNode("./a").Attributes["href"].Value; string title = item.InnerText; string remark = item.SelectSingleNode("./span[@class='puber']").InnerText; var splitArr = remark.Split(' '); string dep = splitArr[0].TrimStart('['); string time = splitArr[1].TrimEnd(']'); noticeItems.Add(new Notice() { Href = href, Title = title, Dep = dep, Time = time }); } } return noticeItems.Where(u => Convert.ToDateTime(u.Time).Date.Equals(DateTime.Now)).ToList(); } }
比較倆日期相同
方法一:
System.Data.Entity.DbFunctions.DiffDays(cs.StartTime.Value,DateTime.Now) == 0只獲取當天
方法二:
XX.StartTime.Value.Date.Equals(DateTime.Now.Date)//只獲取當天
使用方法一.png
第三步:使用QuartZ建立一個定時任務
1.建立一個 ToExcelJob 繼承 IJob介面,實現方法
定時方法.png
定時方法Exceute種分倆部分執行
第一部分:獲取爬取後的資料
第二部分:資料儲存到Excel檔案
public class ToExcelJob : IJob { private static string excelPath = ConfigurationManager.AppSettings["ExcelPath"]; static readonly ILog Log = LogManager.GetLogger(typeof(ToExcelJob)); public void Execute(IJobExecutionContext context) { try { if (!Directory.Exists(excelPath)) { Directory.CreateDirectory(excelPath); } var items = JKNews.GetTodayNews(); var excel = new Excel(); excel.CreateSheet("Sheet1"); int rowIndex = 0; excel.WriteTitle(new string[] { "連結", "標題", "部門", "日期" }, 0, 0); rowIndex++; foreach (var item in items) { excel.CreateRow(0, rowIndex); excel.WriteProperty<Notice>(item, 0, rowIndex, 0); rowIndex++; } excel.SetColumnWidth(0, 0, new[] { 20, 30, 10, 10 }); string savePath = Path.Combine(excelPath, string.Format("{0}.xlsx", DateTime.Now.ToString("yyyy.MM.dd"))); excel.WriteFile(savePath); } catch (Exception ex) { Log.Error(ex.Message, ex); } } }
第四步:定製TopShelf服務類,對開始和結束進行程式碼描述
建構函式中使用Quartz.Net 開始進行任務的建立
首先建立一個排程器
然後建立一個任務
然後建立一個觸發器,這一步中我們設定了cron為每晚8點,具體使用的大家可以看cron語法
然後將任務與觸發器新增到排程器中並執行
在建構函式中對當前任務(Job)進行初始化配置,然後開放倆個方法Start和Stop讓便上層呼叫
public class ToExcelRunner { static readonly ILog _log = LogManager.GetLogger(typeof(ToExcelRunner)); private readonly IScheduler scheduler; public ToExcelRunner() { // 建立一個排程器 scheduler = StdSchedulerFactory.GetDefaultScheduler(); //2、建立一個任務 IJobDetail job = JobBuilder.Create<ToExcelJob>().WithIdentity("job1", "group1").Build(); //3、建立一個觸發器 ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0 0 20 ? * *") //每天晚上8點執行 .Build(); //4 將任務與觸發器新增到排程器中並執行 scheduler.ScheduleJob(job, trigger); } public void Start() { try { _log.Info("服務開啟"); scheduler.Start(); } catch (Exception e) { Console.WriteLine(e); throw; } } public void Stop() { _log.Info("服務結束"); scheduler.Shutdown(false); } }
第五步:TopShelf配置
s.ConstructUsing(name => new ToExcelRunner()); 服務使用ToExcelRunner
對服務的Started註冊tc.Start()方法
對服務的Stopped註冊tc.Stop()方法
使用日誌記錄,出錯時候記錄。
class Program { static readonly ILog _log = LogManager.GetLogger(typeof(Program)); static void Main(string[] args) { FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "\log4net.config"); XmlConfigurator.ConfigureAndWatch(fi); try { HostFactory.Run(x => { x.Service<ToExcelRunner>(s => { s.ConstructUsing(name => new ToExcelRunner()); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); x.SetDescription("每天晚上8點講當日新聞儲存為Excel"); x.SetDisplayName("新聞儲存服務"); x.SetServiceName("新聞儲存服務"); }); } catch (Exception ex) { _log.Error(ex); } } }
第六步:釋出為windows服務
配置執行
沒錯,整個程式已經開發完了,接下來,只需要簡單配置一下,即可以當服務來使用了。安裝很方便:
安裝:JKNoticeget.exe install
啟動:JKNoticeget.exe start
解除安裝:JKNoticeget.exe uninstall
管理員身份進入,對應路徑,註冊服務
image.png
image.png
image.png
作者:HapplyFox
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2820204/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 定時任務crond服務
- 爬爬爬爬爬某企鵝的影片,加了代理和定時任務
- Windows 服務設定工具 WinSW 使用教程Windows
- vbs指令碼和windows定時任務實現qq訊息表情包定時傳送指令碼Windows
- 定時任務報警通知解決方案詳解
- 《區塊鏈資訊服務管理規定》解讀區塊鏈
- React-列表元件(通知列表、私信列表、虛擬列表)React元件
- 使用開源ntfy訊息推送服務釋出通知實現全平臺接收通知
- 谷歌釋出白皮書 詳細介紹幾大服務中如何打擊虛假資訊谷歌
- windows定時任務執行路徑問題Windows
- Python爬蟲二:抓取京東商品列表頁面資訊Python爬蟲
- 全球資訊網服務
- 旺家樂智慧鎖全國售後服務點熱線(今日已更新列表)
- Windows 服務管理Windows
- Chrome 68已支援Windows 10原生通知功能 可遵從行動中心的設定ChromeWindows
- JVM 中配置服務時區JVM
- 模型的列表定義中,使用函式時如何定義引數?模型函式
- 震驚!Windows Service服務和定時任務框架quartz之間原來是這種關係……Windows框架quartz
- redis:新增redis到服務列表Redis
- 爬取市場價格,全國農產品商務資訊公共服務平臺
- 物流服務網站搭建,從定製到開發一體化服務網站
- windows10防火牆通知一直打不開怎麼辦_win10防火牆通知打不開如何修復Windows防火牆Win10
- MYSQL定時任務-定時清除備份資料MySql
- 推送服務本地通知頻次及分類管控通知
- 聚寶狗智慧鎖全國售後服務電話號碼(今日已更新列表)
- 獲取AFP服務資訊
- 物件儲存服務的事件通知特性物件事件
- Android 通知欄顯示自定義通知時設定更高的高度Android
- 秒懂雲通訊:如何用阿里雲語音通知服務(小白指南)阿里
- 【FAQ】HMS Core推送服務與本地建立通知訊息如何相互覆蓋?
- 如何將MongoDB加入到Windows服務中MongoDBWindows
- windows 服務中託管asp.net coreWindowsASP.NET
- windows驅動註冊中斷服務程式Windows
- 3分鐘帶你掌握Spring Boot中的定時排程服務Spring Boot
- Linux系統中延時任務及定時任務Linux
- Windows刪除服務Windows
- 服務維護之crontab定時監測告警
- spring boot中的定時任務Spring Boot