背景 html
前段時間公司有個需求(天天給業務導出一批數據,以excel的形式經過郵件發送給他)。A說:直接寫個服務,判斷等於某個時間點,執行一下sql語句,生成excel,寫個EmaiHelper發送給他不就得了,這有什麼麻煩的?B說:我了個親孃來,還寫服務呢?你還須要搞個timer去判斷時間點?多費勁啊,直接寫個控制檯程序,添加個任務計劃,不就搞定了嗎?我只想說:大家都是大神,每次都不加點新的東西,還寫什麼代碼,多麼沒勁啊,前兩天看到了topshelf+quartz.net這個東東,能夠作個練習了。。。。linux
目的 git
使用topshelf+quartz.net以windows服務形式來導出excel數據github
dapper只是懶得進行數據庫相關操做,這個orm能夠幫我省下很多工做sql
npoi固然是生成excel的了,一直在用npoi跟excel打交道(無論獲取excel數據,仍是生成excel文件)數據庫
ioc我使用的是autofactwindows
介紹 app
好了,接下來大致說一下。ide
topshelf官方網站:http://topshelf-project.com/ 工具
github地址:https://github.com/Topshelf/Topshelf/)
topshelf文檔:http://docs.topshelf-project.com/en/latest/configuration/quickstart.html
topshelf是建立windows服務的一種方式,相比原生實現ServiceBase、Install.Installer更爲簡單方便, 咱們只須要幾行代碼便可實現windows服務的開發。topshelf自己支持windows及linux下mono上部署安裝,一樣也是開源的。
topshelf相對原生來講,調試起來比較方便,能夠在開發時以控制檯的形式直接f5調試,發佈時用命令以服務的形式部署。還一個比較有用的特性是支持多實例的部署,這樣能夠在一臺機器上部署多個相對的服務。相似的工具備instsrv和srvany。
topshelf有兩種使用方式,下面代碼來自官方文檔推薦用法
1 public class TownCrier 2 { 3 readonly Timer _timer; 4 public TownCrier() 5 { 6 _timer = new Timer(1000) {AutoReset = true}; 7 _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now); 8 } 9 public void Start() { _timer.Start(); } 10 public void Stop() { _timer.Stop(); } 11 } 12 13 public class Program 14 { 15 public static void Main() 16 { 17 HostFactory.Run(x => //1 18 { 19 x.Service<TownCrier>(s => //2 20 { 21 s.ConstructUsing(name=> new TownCrier()); //3 22 s.WhenStarted(tc => tc.Start()); //4 23 s.WhenStopped(tc => tc.Stop()); //5 24 }); 25 x.RunAsLocalSystem(); //6 26 27 x.SetDescription("Sample Topshelf Host"); //7 28 x.SetDisplayName("Stuff"); //8 29 x.SetServiceName("Stuff"); //9 30 }); //10 31 } 32 }
效果以下圖:
沒錯,一個簡單的topshelf程序就是這麼簡單,接下來,只須要簡單配置一下,便可以當服務來使用了。安裝很方便:
安裝成功後,接下來,咱們就能夠看到服務裏多了一個服務:
說完topshelf,接下來講說quartz.net