zoukankan      html  css  js  c++  java
  • 使用Topshelf创建Windows服务

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇。

    可以访问ABP模板 创建项目 Demo.MyJob,ABP的模板是创建Web项目,而Topshelf所需的是Console项目。

    Topshelf是什么

    Topshelf开源地址:https://github.com/Topshelf/Topshelf
    Topshef是一个简单的托管框架,通过Topshelf可以使用.Net简便的创建Windows服务。你需要先创建一个Console程序,然后使用Topshelf创建服务。调试控制台应用程序,确认服务可用性之后,安装即可。
    Topshelf官方文档地址:https://topshelf.readthedocs.io/en/latest/

    创建Console,集成Topshelf

    新建Console程序Demo.MyJob,nuget添加Topshelf

    实现AbpModule

    因为要接入ABP,所以第一步要实现自己的AbpModule。

    using System.Reflection;
    using Abp.Modules;
    
    namespace Demo.MyJob
    {
        [DependsOn(typeof(MyJobApplicationModule))]
        public class MyJobAbpModule : AbpModule
        {
            public override void Initialize()
            {
                IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
            }
        }
    }
    

    初始化

    然后在Main函数入口处初始化我们的ABP Job系统。

    using Abp;
    
    namespace Demo.MyJob
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var bootstrapper = AbpBootstrapper.Create<MyJobAbpModule>())
                {
                    bootstrapper.Initialize();
                }
            }
        }
    }
    

    定义MyJobService

    定义操作

    using System.Threading.Tasks;
    
    namespace Demo.MyJob
    {
        public class MyJobService
        {
            public async Task StartAsync()
            {
                //操作逻辑
            }
    
            public async Task StopAsync()
            {
                //操作逻辑
            }
    
            public async Task ContinueAsync()
            {
                //操作逻辑
            }
    
            public async Task PauseAsync()
            {
                //操作逻辑
            }
        }
    }
    
    

    配置运行逻辑

    using System.Reflection;
    using Abp.Modules;
    using Topshelf;
    
    namespace Demo.MyJob
    {
        [DependsOn(typeof(MyJobApplicationModule))]
        public class MyJobAbpModule : AbpModule
        {
            public override void Initialize()
            {
                IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
            }
    
            public override void PostInitialize()
            {
                HostFactory.Run(configure =>
                {
                    //定义服务描述
                    configure.SetDescription("Demo.MyJob Service");
                    configure.SetDisplayName("Demo.MyJob");
                    configure.SetServiceName("Demo.MyJob");
    
                    configure.RunAsLocalSystem();
    
                    //定义操作
                    configure.Service<MyJobService>(service =>
                    {
                        service.ConstructUsing(_ => new MyJobService());
                        service.WhenStarted(async _ => await _.StartAsync());
                        service.WhenStopped(async _ => await _.StopAsync());
                        service.WhenContinued(async _ => await _.ContinueAsync());
                        service.WhenPaused(async _ => await _.PauseAsync());
                    });
                });
            }
        }
    }
    
    

    调试结果

    Configuration Result:
    [Success] Name Demo.MyJob
    [Success] Description Demo.MyJob Service
    [Success] ServiceName Demo.MyJob
    Topshelf v4.2.0.194, .NET Framework v4.0.30319.42000
    The Demo.MyJob service is now running, press Control+C to exit.
    

    发布并尝试安装

    发布配置如下

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    https://go.microsoft.com/fwlink/?LinkID=208121. 
    -->
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <PublishProtocol>FileSystem</PublishProtocol>
        <Configuration>Release</Configuration>
        <Platform>Any CPU</Platform>
        <TargetFramework>netcoreapp2.2</TargetFramework>
        <PublishDir>D:PublishDemo.MyJob</PublishDir>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <SelfContained>true</SelfContained>
        <_IsPortable>false</_IsPortable>
      </PropertyGroup>
    </Project>
    

    以管理员身份打开cmd命令行终端,在发布目录下执行安装命令

    C:Windowssystem32>D:
    
    D:>cd D:PublishDemo.MyJob
    
    D:PublishDemo.MyJob>Demo.MyJob install
    Configuration Result:
    [Success] Name Demo.MyJob
    [Success] Description Demo.MyJob Service
    [Success] ServiceName Demo.MyJob
    Topshelf v4.2.0.194, .NET Framework v4.0.30319.42000
    
    Running a transacted installation.
    
    Beginning the Install phase of the installation.
    Installing Demo.MyJob service
    Installing service Demo.MyJob...
    Service Demo.MyJob has been successfully installed.
    
    The Install phase completed successfully, and the Commit phase is beginning.
    
    The Commit phase completed successfully.
    
    The transacted install has completed.
    

    卸载命令Demo.MyJob uninstall,如果服务当前正在运行,该命令将先尝试停止服务,再将其移除。

    D:PublishDemo.MyJob>Demo.MyJob uninstall
    Configuration Result:
    [Success] Name Demo.MyJob
    [Success] Description Demo.MyJob Service
    [Success] ServiceName Demo.MyJob
    Topshelf v4.2.0.194, .NET Framework v4.0.30319.42000
    
    
    The uninstall is beginning.
    Uninstalling Demo.MyJob service
    Service Demo.MyJob is being removed from the system...
    Service Demo.MyJob was successfully removed from the system.
    Attempt to stop service Demo.MyJob.
    
    The uninstall has completed.
    
  • 相关阅读:
    【NOIP2016提高组】 Day1 T3 换教室
    【NOIP2016 Day1 T2】天天爱跑步
    web@前端--html,css,javascript简介、第一个页面(常用标签简介)
    MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
    MySQL--pymysql模块
    MySQL--(了解)可能会用到的内置函数
    MySQL--详细查询操作(单表记录查询、多表记录查询(连表查询)、子查询)
    MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
    MySQL--表操作(innodb表字段数据类型、约束条件)、sql_mode操作
    MySQL基本语句、存储引擎
  • 原文地址:https://www.cnblogs.com/AlienXu/p/Abp_Topshelf.html
Copyright © 2011-2022 走看看