windows服务+定时任务(quartz.net)+nancy
需求一:软件要能在操作系统启动后,自动运行
因为操作系统是windows 10,所以最先想到的是windows服务,因为windows服务有个自动启动选项,设为true就行了。
.net做这个最合适了,可以建windows服务项目。
需求二:包含N个任务,要求每天、每周、每月都可以执行,时间可自己设置
面对这个需求,很明显Timer不适合了,最先想到的便是Quartz.net,因为这个东西之前也用过,所以就用它了。满足需求绰绰有余。
有一点需要说明的是,具体时间是保存在数据库里面的,服务在从数据库读取到时间后,还需要将设置的时间转换成cron表达式。
需求三:领导说你能在这个windows服务里面提供web api吗?这样就不用单独的再创建一个接口项目了。
一开始想用HttpListener自己写个简单的http web服务器,毕竟接口就一个。
但是后来想到这种东西应该有别人写好的吧,所以就百度了下,发现Nancy比较合适。使用它可以监听指定端口,提供web服务。
而且,我是通过job将最终需要执行的消息放在队列里面,然后去消费队列。没有用第三方的队列,用的是ConcurrentQueue。
所以如果另外建web项目,就属于两个不同的项目,没办法消费队列了。
注意:在服务停止后,需要关闭后台运行的线程,不然服务虽然停止了,但是未执行完的代码依然还会执行。
/// <summary> /// 关闭相关后台线程,使得服务结束时,线程也关闭 /// </summary> protected override void OnStop() { //关闭quartz if (!_scheduler.IsShutdown) { _scheduler.Shutdown(); _logger.Info("quartz scheduler has shutdown"); } //关闭http server if (_nancyHost != null) { _nancyHost.Stop(); _logger.Info("http server has stoped"); } //关闭socket检测 this._checkSocketTimer.Dispose(); _logger.Info("_checkSocketTimer has disposed"); }
特此记下解决方案,以备后用。