Quartz.NET总结(七)使用Topshelf 开发windows服务
在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发。如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 windows service 相关的一些开发和安装部署,所以,windows service非常的不方便。Topshelf框架,能够让你将 console application 直接封装为 windows service,这样你在开发的时候,就可以直接在console 程序上开发,然后构成windows service。可以说非常方便。省去了很多不必要的麻烦。
Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。TopShelf 支持多个服务实例,使用的API非常简单,也提高了和 Log4Net的集成,结合Quartz.net,可以快速实现任务调度服务。
1.下载地址
https://github.com/Topshelf/Topshelf/downloads
2.创建Console宿主程序TopshelfTest,并引用TopShelf.dll
3.相关代码
public class TownCrier
{
readonly Timer _timer;
public TownCrier()
{
_timer = new Timer(1000) { AutoReset = true };
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);
}
public void Start() { _timer.Start(); }
public void Stop() { _timer.Stop(); }
}
// 入口代码
public class Program
{
public static void Main()
{
HostFactory.Run(x => //1.我们用HostFactory.Run来设置一个宿主主机。我们初始化一个新的lambda表达式X,来显示这个宿主主机的全部配置。
{
x.Service<TownCrier>(s => //2.告诉Topshelf ,有一个类型为“towncrier服务”,通过定义的lambda 表达式的方式,配置相关的参数。
{
s.ConstructUsing(name => new TownCrier()); //3.告诉Topshelf如何创建这个服务的实例,目前的方式是通过new 的方式,但是也可以通过Ioc 容器的方式:getInstance<towncrier>()。
s.WhenStarted(tc => tc.Start()); //4.开始 Topshelf 服务。
s.WhenStopped(tc => tc.Stop()); //5.停止 Topshelf 服务。
});
x.RunAsLocalSystem(); //6.这里使用RunAsLocalSystem() 的方式运行,也可以使用命令行(RunAsPrompt())等方式运行。
x.SetDescription("Sample Topshelf Host"); //7.设置towncrier服务在服务监控中的描述。
x.SetDisplayName("Stuff"); //8.设置towncrier服务在服务监控中的显示名字。
x.SetServiceName("Stuff"); //9.设置towncrier服务在服务监控中的服务名字。
});
}
}
本人英文水平有限,代码的备注说明,随便翻译的,凑合看吧。
4. 安装和卸载windows服务
TopshelfTest.exe install #安装Windows服务
TopshelfTest.exe uninstall #卸载Windows服务
TopshelfTest.exe install -instance "xxx" -servicename "xxx" -description "xxx" -displayname "xxx" #安装不同的实例
作者:章为忠
如有问题,可以微信:18618243664 联系我,非常感谢。
关注我的微信公众号,获取相关的 源代码及视频资料。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?