【框架学习与探究之宿主服务--Topshelf】

前言

此文欢迎转载,原始连接地址:http://www.cnblogs.com/DjlNet/p/7603819.htmlhtml


正文

原先也偶然见过这个关键词,当时只是有个大体了解貌似和WinService开发有关系,此前在对Quartz.Net了解的时候再次接触到TopShelf,这个时候博主就认为不能一笔带过了,此框架须要另起一篇小文对于它有一个稍微更加详细的说明与实践,看看当对于原生的winservice开发或许方便了许多在哪里,那么今天咱们就综合园友的文章以及官方文档的脚步学习一下吧......linux


TopShelf

这里优先给出地址:https://github.com/topshelf/topshelf,同时这里引用一下官方的描述:An easy service hosting framework for building Windows services using .NET。一个使用.NET可以简单构建windows服务的自托管开发框架,且能够在安装了mono的linux上面运行也实现了必定程度上面的跨平台,同时咱们看到star的数量超过2K,也说明了在这块必定的受欢迎程度。它可以让服务的建立被简化,容许开发人员建立一个简单的控制台应用程序,能够使用Topshelf做为服务安装。这样一来调试控制台应用程序比服务容易得多,也不用挂载进程调试了,并且一旦应用程序通过测试并能够进行生产,Topshelf能够轻松安装应用程序做为服务,几行cmd命令都搞定了。接下来就按照文档来讲一说它,这里博主仍是选取些以为重要些的东西记录....git


TopShelf至少得在.NET3.5SP1及其以上的环境中运行,它须要.NET环境运行时才可以运行
下面的代码来自与官方例子,其中较好的说明了使用方法以及经常使用配置说明:github

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 =>                                
        {
            x.Service<TownCrier>(s =>                       
            {
               s.ConstructUsing(name=> new TownCrier());    
               s.WhenStarted(tc => tc.Start());             
               s.WhenStopped(tc => tc.Stop());              
            });
            x.RunAsLocalSystem();                            

            x.SetDescription("Sample Topshelf Host");       
            x.SetDisplayName("Stuff");                       
            x.SetServiceName("Stuff");                       
        });                                                  
    }
}

大体从上面代码就能够看出一些使用方式和套路,同时咱们也发现了一个应用场景就是适合常驻任务进程,例如一些定时任务或者被动触发类(消费消息队列什么的)的程序来做为主要逻辑,正好就是场景应用比较好的体现。windows


服务配置方面,提供了两种配置方式,不过道理都同样,(1)将你的自定义逻辑实现接口ServiceControl ,而后在 HostFactory.New(x =>
{ x.Service<MyService>(); });
添加便可,这种方式还能够指定依赖项,固然也能够依赖注入(2)框架

HostFactory.New(x =>
{
    x.Service<MyService>(sc =>
    {
        sc.ConstructUsing(() => new MyService());

        // the start and stop methods for the service
        sc.WhenStarted(s => s.Start());
        sc.WhenStopped(s => s.Stop());

        // optional pause/continue methods if used
        sc.WhenPaused(s => s.Pause());
        sc.WhenContinued(s => s.Continue());

        // optional, when shutdown is supported
        sc.WhenShutdown(s => s.Shutdown());
    });
});

这种自定义服务的方式适合零依赖,控制灵活推荐使用,固然爱怎么注入与解析都提供了机会函数

服务启动方式,这里TopShelf提供了4种,其实也是winservice的那几种方式了,这里
x.StartAutomatically(); // Start the service automatically 自动启动
x.StartAutomaticallyDelayed(); // Automatic (Delayed) -- only available on .NET 4.0 or later 自动延迟启动
x.StartManually(); // Start the service manually 手动
x.Disabled(); // install the service as disabled 禁用学习

服务恢复:EnableServiceRecovery 主要配置项目以下:(具体能够看API的描述便可)测试

HostFactory.New(x =>
{
    x.EnableServiceRecovery(r =>
    {
        //you can have up to three of these
        r.RestartComputer(5, "message");
        r.RestartService(0);
        //the last one will act for all subsequent failures
        r.RunProgram(7, "ping google.com");

        //should this be true for crashed or non-zero exits
        r.OnCrashOnly();

        //number of days until the error count resets
        r.SetResetPeriod(1);
    });
});

要配置服务恢复选项,配置程序可用于指定一个或多个服务恢复操做。恢复选项仅在安装服务时使用,并在服务成功安装后设置。恢复操做按照指定的顺序执行,下一个操做在上一个操做运行后再执行,在服务失败复苏时。存在能够执行多少动做的限制(基于OS),一般是2-3动做。ui

服务运行身份标识:x.RunAs("username", "password"); x.RunAsPrompt(); x.RunAsNetworkService(); x.RunAsLocalSystem(); x.RunAsLocalService();
自定义服务安装卸载行为(注入委托):x.BeforeInstall(() => { ... }); x.AfterInstall(() => { ... }); x.BeforeUninstall(() => { ... }); x.AfterUninstall(() => { ... });
服务依赖:能够指定服务依赖关系,以便在从属服务启动以前服务不会启动。这由Windows服务控制管理器管理,而不是由Topshelf自己管理。x.DependsOn("SomeOtherService");,这里TopShelf框架内置了几个经常使用的依赖性配置:
x.DependsOnMsmq(); // Microsoft Message Queueing
x.DependsOnMsSql(); // Microsoft SQL Server
x.DependsOnEventLog(); // Windows Event Log
x.DependsOnIis(); // Internet Information Server

高级配置: x.EnablePauseAndContinue();容许暂停和继续,这里考虑到某些任务具备如此需求场景,例如定时器等等; x.EnableShutdown(); 指定该服务支持shutdown服务命令,容许服务控制管理器快速关闭服务。

HostFactory.New(x =>
{
    x.OnException(ex =>
    {
        // Do something with the exception
    });
});

为服务运行时抛出的异常提供回调。这个回调函数不是处理程序,不会影响Topshelf已经提供的默认异常处理。旨在提供触发外部操做,日志等的抛出异常的可见性。

Logging Integration with Topshelf (日志集成):默认状况下,Topshelf使用TraceSource进行日志记录。这是.NET框架的一部分,所以不会引入任何额外的依赖关系。可是,许多应用程序使用更高级的日志库,例如Log4net或NLog。为了支持这一点,Topshelf使用了可扩展的日志界面。x.UseLog4Net();利用Topshelf.Log4Net便可轻松集成,这将使HostLogger更改成使用log4net。有一个重载能够指定一个配置文件。若是给定,文件名将被解析到ApplicationBase文件夹并传递给log4net以配置日志追加器和级别;x.UseNLog();依赖Topshelf.NLog,同理这将更改HostLogger以使用NLog,也能够使用相同方法的重载来传递现有的LogFactory。

Topshelf Command-Line Reference(Topshelf命令行参考):这里直接给出参考地址:https://topshelf.readthedocs.io/en/latest/overview/commandline.html,内容差很少很详细了


小总结

其实总体来讲,TopShelf已经封装了挺优秀了,使用方便以及API的友好性方面都作得挺不错,因此也值得咱们学习和研究,此文大体上基本也是对文档内容作了一个大体摘录和整理,要说有什么干货也就这样了,不过咱们由此得出学习或者研究一个新玩意,来的最直接就是阅读官方文档和一些参考实现。


参考

http://www.cnblogs.com/pengze0902/p/6602737.html 使用Topshelf组件构建简单的Windows服务,这里顺便引用一下地址博主的图片做为参考(图片来源于上面地址):

相关文章
相关标签/搜索