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");
        }

特此记下解决方案,以备后用。

posted @ 2019-12-24 19:57  屌丝大叔的笔记  阅读(783)  评论(0编辑  收藏  举报