在.net平台使用Quartz+Topshelf创建windows服务

简介: 使用Topshelf来创建服务,但是我们经常都写成定时服务,有具体的时间点,所以这里我使用Quartz+Topshelf创建windows服务来供大家参考,把更多的重心放在业务处理中

背景

对于使用Windows操作系统的人来说,Windows Service(Windows服务)应该不会陌生。在工作中我们经常需要定时处理一些业务,例如晚上零晨抓取一批数据,如果我们用C#语言创建windows服务也是可以的,但是步骤比较繁琐,不好调试。所以上篇文章中我使用windows计划执行控制台程序,但是呢也不是足够完美,因为计划一旦开始执行时控制台的窗口会被唤起,这时如果有人关掉了该窗口,那么也会影响业务的处理(毕竟公司的服务器多个程序员使用嘛)。

鉴于以上种种原因,我查找了一些资料,看到老外使用Topshelf来创建windows服务,比较完美。下面开始演示步骤;

第一步:

打开VS创建一个控制台程序,这里我去明叫“MyQuartzWindowsService”(版本选择4.6.1或以上),当然4.6.1以下版本也可以,只是选择Topshelf时不要选择最高版本。

第二步:

打开nuget搜索“Topshelf”进行安装
1.png

第三步:

打开nuget搜索“Quartz”进行安装
2.png

第四步:

创建一个定时服务类“QuartzServiceRunner”,并写入以下代码

 {
  private readonly IScheduler scheduler;    
  public QuartzServiceRunner()
   {
     scheduler = StdSchedulerFactory.GetDefaultScheduler();
   }
    public void Start()
    {
    //从配置文件中读取任务启动时间
     string cronExpr = ConfigurationManager.AppSettings["cronExpr"];
     IJobDetail job = JobBuilder.Create<DeleteDomainJob>().WithIdentity("job1", "group1").Build();
      //创建任务运行的触发器
      ITrigger trigger = TriggerBuilder.Create()
         .WithIdentity("triggger1", "group1")
         .WithSchedule(CronScheduleBuilder.CronSchedule(new CronExpression(cronExpr)))
         .Build();
       //启动任务
        scheduler.ScheduleJob(job, trigger);
        scheduler.Start();
        scheduler.Start();         
     }
     public void Stop()
      {
       scheduler.Clear();
      }
     public bool Continue()
      {
        scheduler.ResumeAll();
        return true;
      }
      public bool Pause()
       {
        scheduler.PauseAll();
        return true;
      }
    }
第五步:

创建一个业务类"DeleteDomainJob"并继承IJob

 {    
   public void Execute(IJobExecutionContext context)
    {           
      LogHelper.Writelog($"任务开始{DateTime.Now}");  
        //这里是业务处理,我就简单记录下日志  
     }     
  }

关于LogHelper类这里也放出来

 {
  public static void Writelog(string str)
   {
   Task.Run(() =>
    {
     string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log.txt");
      string logContent = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:{str}\r\n";
      File.AppendAllText(filePath, logContent);
    });
     }
 }
第六步:

控制台Program类中写入一下代码(关于Topshelf)

{
  static void Main(string[] args)
  {         
    HostFactory.Run(x =>
     {
       x.Service<QuartzServiceRunner>(s =>
      {
        s.ConstructUsing(name => new QuartzServiceRunner());
         s.WhenStarted(tc => tc.Start());
          s.WhenStopped(tc => tc.Stop());
      });
       x.RunAsLocalSystem();
       x.StartAutomatically();
       x.SetDescription("火虫网定时服务");
       x.SetDisplayName("火虫网定时服务");
       x.SetServiceName("火虫网定时服务");
       });
      }
 }
第七步:安装服务

我们定位到程序debug路径中(你也可以选择release下编译),启用命令提示符(以管理员身份运行),并用MyQuartzWindowsService.exe install命令安装服务

3.png
卸载命令也很简单,MyQuartzWindowsService.exe unistall。

最后我们来看一下服务到底安装好没,在Windows操作系统中,我们可以在”运行”窗口中运行service.msc:
4.png
我们看下日志到底写没写进去,看下图
6.png

总结

使用C#语言创建windows服务也是可以的,但是碍于难调试,步骤比较繁琐,这里我使用Topshelf来创建服务,但是我们经常都写成定时服务,有具体的时间点,所以这里我使用Quartz+Topshelf创建windows服务来供大家参考,把更多的重心放在业务处理中。

相关文章
|
4天前
|
敏捷开发 设计模式 开发者
【揭秘终极利器】AgileEAS.NET:服务定位器模式的魔法,如何让企业级软件开发瞬间提速?揭秘背后的技术奥秘与实战指南!
【8月更文挑战第16天】AgileEAS.NET是基于DotNet的企业级敏捷开发平台,其服务定位器模式助力构建高度解耦系统。通过全局服务目录动态查找服务,避免硬编码依赖。在AgileEAS.NET中,服务定位器以静态类形式封装服务注册与检索功能。示例展示了如何注册与获取服务实例,如在`UserController`中通过服务定位器使用`IUserService`。此模式整合到框架生命周期管理,便于各处获取服务实例,提升开发效率。然而,应适度使用并考虑依赖注入容器以增强代码可维护性和可测试性。
14 4
|
5天前
|
Java Windows
SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
16 2
|
7天前
|
编解码 开发工具 Android开发
Windows平台RTMP推送|轻量级RTSP服务如何实现摄像头叠加到屏幕输出
大牛直播SDK采用先进的图层概念实现视频叠加,如将摄像头画面实时叠加到屏幕输出,以C#为例展示了具体的配置方法。用户可在推送RTMP或启动RTSP服务前选择“摄像头叠加到屏幕”的选项,并调整位置。SDK还支持摄像头的开启与关闭、水平垂直翻转及旋转等功能。此外,该SDK提供了丰富的特性,包括但不限于视频和音频采集处理、硬编码与软编码支持、多实例推送、水印添加、网络适应性调整等,几乎涵盖了RTMP推送的所有常规需求,并能与播放器协同工作达到毫秒级的低延迟,非常适合无纸化同屏、智慧教室等应用场景。
|
7天前
|
开发工具 数据安全/隐私保护 开发者
Windows平台RTMP推送|轻量级RTSP服务摄像头如何添加动态文字水印
本文介绍了在Windows平台上实现摄像头或屏幕流中动态文字水印的技术方法。通过大牛直播SDK示例,展示了如何从文本获取RGB数据,并将其叠加到视频流上。文中提供了代码片段来说明如何开启文字水印、生成包含实时信息的位图、以及如何更新和控制图层。最终实现了动态显示时间和位置信息的需求。对这一领域的开发者而言,本文提供了实用的参考与指导。
|
4天前
|
开发框架 .NET API
.Net Core Console 项目如何使用 HttpClient 与 Web 服务通信
.Net Core Console 项目如何使用 HttpClient 与 Web 服务通信
|
5天前
|
Java 数据安全/隐私保护 Windows
Windows Service 服务中,不能访问挂载目录(网络映射盘)
Windows Service 服务中,不能访问挂载目录(网络映射盘)
11 0
|
6天前
|
编解码 开发工具 C#
Windows电脑如何启动RTSP服务实现本地摄像头数据共享
本文介绍如何利用大牛直播SDK中的轻量级RTSP服务,在Windows平台上轻松采集摄像头数据并生成本地RTSP流。通过SDK提供的SmartPublisherDemo工具,用户能简便地选择摄像头、配置分辨率与帧率,并启动RTSP服务。此外,还支持音频采集、多端口服务以及动态水印等功能。生成的RTSP URL可用于其他终端拉流播放,无需额外部署服务器。该服务适配多种应用场景,如安防监控、电子教室等,并兼容Windows 7及以上版本。对于希望集成此功能的开发者,SDK提供了C++及C#接口,并支持多种编译模式。
|
6天前
|
监控 开发工具 数据安全/隐私保护
Windows平台如何实现多路RTSP|RTMP流合成后录像或转发RTMP服务
本文介绍了在Windows平台上实现多路RTSP/RTMP视频流的合并技术。主要应用场景包括驾考、全景摄像头以及多路会议录制等。技术实现上,文章详细展示了如何使用特定的SDK来解码并回调YUV或RGB数据,再将这些数据按照图层形式进行合成。示例代码中给出了初始化参数、设置视频帧回调函数、以及如何配置不同图层的具体步骤。最终,合成后的视频可以推送到RTMP服务器、注入到本地RTSP服务,或是直接录制为MP4文件。此外,还提供了添加实时文字水印的方法,并展示了四路视频流合成后的“四宫格”效果。
|
4天前
|
开发框架 .NET API
Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
13 0
|
6天前
|
Linux Docker Windows
Windows——Docker拉取Windows Server镜像
Windows——Docker拉取Windows Server镜像
14 0

热门文章

最新文章