我们只要在Startup的ConfigureServices方法里面注册我们的几个后台任务就可以了。
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); services.AddHostedService<PrinterHostedService2>(); services.AddHostedService<TimerHostedService>(); services.AddHostedService<ComsumeRabbitMQHostedService>(); }启动Web站点后,我们发了20条MQ消息,再访问了一下Web站点的首页,最后是停止站点。
下面是日志结果,都是符合我们的预期。
可能大家会比较好奇,这三个后台任务是怎么混合在Web项目里面启动的。
答案就在下面的两个链接里。
https://github.com/aspnet/Hosting/blob/2.1.1/src/Microsoft.AspNetCore.Hosting/Internal/HostedServiceExecutor.cs
上面说了那么多,都是在本地直接运行的,可能大家会比较关注这个要怎样部署,下面我们就不看看怎么部署。
部署部署的话,针对不同的情形(web和非web)都有不同的选择。
正常来说,如果本身就是web程序,那么平时我们怎么部署的,就和平时那样部署即可。
花点时间讲讲部署非web的情形。
其实这里的部署等价于让程序在后台运行。
在Linux下面让程序在后台运行方式有好多好多,Supervisor、Screen、pm2、systemctl等。
这里主要介绍一下systemctl,同时用上面的例子来进行部署,由于个人服务器没有MQ环境,所以没有启用消费MQ的后台任务。
先创建一个 service 文件
vim /etc/systemd/system/ghostdemo.service内容如下:
[Unit] Description=Generic Host Demo [Service] WorkingDirectory=http://www.likecs.com/var/www/ghost ExecStart=http://www.likecs.com/usr/bin/dotnet /var/www/ghost/ConsoleGHost.dll --environment Staging KillSignal=SIGINT SyslogIdentifier=ghost-example [Install] WantedBy=multi-user.target其中,各项配置的含义可以自行查找,这里不作说明。
然后可以通过下面的命令来启动和停止这个服务
service ghostdemo start service ghostdemo stop测试无误之后,就可以设为自启动了。
systemctl enable ghostdemo.service下面来看看运行的效果
我们先启动服务,然后去查看实时日志,可以看到应用的日志不停的输出。
当我们停了服务,再看实时日志,就会发现我们的两个后台任务已经停止了,也没有日志再进来了。
再去看看服务系统日志
sudo journalctl -fu ghostdemo.service发现它确实也是停了。
在这里,我们还可以看到服务的当前环境和根路径。
IHostedService和BackgroundService的区别前面的所有示例中,我们用的都是BackgroundService,而不是IHostedService。
这两者有什么区别呢?
可以这样简单的理解,IHostedService是原料,BackgroundService是一个用原料加工过一部分的半成品。
这两个都是不能直接当成成品来用的,都需要进行加工才能做成一个可用的成品。
同时也意味着,如果使用IHostedService可能会需要做比较多的控制。
基于前面的打印后台任务,在这里使用IHostedService来实现。