定時從列表中爬今日通知資訊,打包成windows服務

gamebus發表於2021-09-09

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&quot;.read.log&quot;"/>
      <!--日誌根據日期滾動-->
      <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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章