在.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服务来供大家参考,把更多的重心放在业务处理中。

相关文章
|
2月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
315 4
|
11天前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
1月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
2月前
|
边缘计算 安全 网络安全
|
25天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
25天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
33 1
|
2月前
|
NoSQL Shell MongoDB
Windows 平台安装 MongoDB
10月更文挑战第10天
66 0
Windows 平台安装 MongoDB
|
2月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
弹性计算 关系型数据库 网络安全
阿里云国际版无法连接和访问Windows服务器中的FTP服务
阿里云国际版无法连接和访问Windows服务器中的FTP服务