背景 前段時間公司有個需求(每天給業務導出一批數據,以excel的形式通過郵件發送給他)。A說:直接寫個服務,判斷等於某個時間點,執行一下sql語句,生成excel,寫個EmaiHelper發送給他不就得了,這有什麼麻煩的?B說:我了個親娘來,還寫服務呢?你還需要搞個timer去判斷時間點?多費勁啊 ...
背景
前段時間公司有個需求(每天給業務導出一批數據,以excel的形式通過郵件發送給他)。A說:直接寫個服務,判斷等於某個時間點,執行一下sql語句,生成excel,寫個EmaiHelper發送給他不就得了,這有什麼麻煩的?B說:我了個親娘來,還寫服務呢?你還需要搞個timer去判斷時間點?多費勁啊,直接寫個控制台程式,添加個任務計劃,不就搞定了嗎?我只想說:你們都是大神,每次都不加點新的東西,還寫什麼代碼,多麼沒勁啊,前兩天看到了topshelf+quartz.net這個東東,可以做個練習了。。。。
目的
使用topshelf+quartz.net以windows服務形式來導出excel數據
dapper只是懶得進行資料庫相關操作,這個orm可以幫我省下不少工作
npoi當然是生成excel的了,一直在用npoi跟excel打交道(不管獲取excel數據,還是生成excel文件)
ioc我使用的是autofact
介紹
好了,接下來大體說一下。
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 }View Code
效果如下圖:
沒錯,一個簡單的topshelf程式就是這麼簡單,接下來,只需要簡單配置一下,即可以當服務來使用了。安裝很方便:
安裝:TopshelfDemo.exe install 啟動:TopshelfDemo.exe start 卸載:TopshelfDemo.exe uninstall安裝成功後,接下來,我們就可以看到服務里多了一個服務:
說完topshelf,接下來說說quartz.net