前言

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


正文

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


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命令都搞定了。接下来就按照文档来说一说它,这里博主还是选取些觉得重要些的东西记录....


TopShelf至少得在.NET3.5SP1及其以上的环境中运行,它需要.NET环境运行时才能够运行

下面的代码来自与官方例子,其中较好的说明了使用方法以及常用配置说明:

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");
});
}
}

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


服务配置方面,提供了两种配置方式,不过道理都一样,(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动作。

服务运行身份标识: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服务,这里顺便引用一下地址博主的图片作为参考(图片来源于上面地址):

【框架学习与探究之宿主服务--Topshelf】的更多相关文章

  1. 【框架学习与探究之消息队列--EasyNetQ(2)】

    声明 本文欢迎转载,系博主原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7654902.html 前言 此文章,是承接上篇:[框架学习与探究之消息队列--Ea ...

  2. 【框架学习与探究之定时器--Hangfire】

    声明 本文欢迎转载,请注明文章原始出处:http://www.cnblogs.com/DjlNet/p/7603632.html 前言 在上篇文章当中我们知道关于Quartz.NET的一些情况,其实博 ...

  3. 【框架学习与探究之定时器--Quartz.Net 】

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7572174.html 前言 这里相信大部分玩家之前现在都应该有过使用定时器的时候或者需求,例如什么定时 ...

  4. 【框架学习与探究之日志组件--Log4Net与NLog】

    前言 本文欢迎转载,作者原创地址:http://www.cnblogs.com/DjlNet/p/7604340.html 序 近日,天气渐冷,懒惰的脑虫又开始作祟了,导致近日内功修炼迟迟未能进步,依 ...

  5. 【框架学习与探究之消息队列--EasyNetQ(1)】

    前言 本文欢迎转载,实属原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7603554.html 废话 既然都是废话了,所以大家就可以跳过了,这里是博主有事没事 ...

  6. 【框架学习与探究之AOP--Castle DynamicProxy】

    声明 本文欢迎转载,原始地址:http://www.cnblogs.com/DjlNet/p/7603654.html 前言 先说一点废话,在此之前博主也在早期就接触了或者看了些许AOP相关的文章,然 ...

  7. 【框架学习与探究之依赖注入--Autofac】

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7603642.html 序 同样的又是一个双11如期而至,淘宝/天猫实时数据显示,开场3分钟总交易额突破 ...

  8. Topshelf 一个简化Windows服务开发的宿主服务框架

    Topshelf是 基于.net框架开发的宿主服务框架.该框架简化了服务的创建,开发人员只需要使用 Topshelf编写一个控制台程序,就能安装为Windows服务.之所以这样原因非常简单:调试一个控 ...

  9. kratos微服务框架学习笔记一(kratos-demo)

    目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...

随机推荐

  1. snowflake主键生成策略

    1.snowflake简介 在分布式系统中,我们需要各种各样的ID,既然是ID那么必然是要保证全局唯一,除此之外,不同当业务还需要不同的特性,比如像并发巨大的业务要求ID生成效率高,吞吐大:比如某些银 ...

  2. 正则表达式 提取<A>标签

    功能用途 主要实现了提取html代码中的a标签和url地址. 示例代码 Regex regex = new Regex("href\\s*=\\s*(?:\"(?<1> ...

  3. 富文本编辑器UEditor的配置使用方法

    将下载的富文本编辑器的文件解压后放到 webcontent 下 如果 文件中的jsp文件夹下的controller.java文件报错的话    就将jsp下的lib文件夹中的文件都复制到  web-i ...

  4. ajax请求后台,有时收不到返回值的解决办法

    昨天下午做项目遇到一个问题,贴出来方便以后翻阅,也给大家个参考. 问题: 具体做的是个文件导入的功能,导入的功能是成功了,但是界面一直得不到返回值,排查了一下午,调试的时候是可以有返回的,但是关掉浏览 ...

  5. JAVA线程池应用的DEMO

    在做很多高并发应用的时候,单线程的瓶颈已经满足不了我们的需求,此时使用多线程来提高处理速度已经是比较常规的方案了.在使用多线程的时候,我们可以使用线程池来管理我们的线程,至于使用线程池的优点就不多说了 ...

  6. chrome开发工具指南(二)

    Application 面板 使用 App Manifest 窗格检查您的网络应用清单和触发 Add to Homescreen 事件. 使用 Service Worker 窗格执行与服务工作线程相关 ...

  7. Java Spring的简单见解

    Spring的注解特性,IOC控制反转 首先了解依赖注入是什么,就是在实例化对象的时候并不需要每次都new对象出来,spring管理对象,在你配置been或者@service时候 Spring会自动帮 ...

  8. makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解

    在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 例如:将两个文件led.c和crt0.S汇编文件,制作一个Makefile文件 led.bin ...

  9. (复杂值vs原始值)&&内存空间 — 准确我们的JavaScript世界观(一):

    写在前面 最近在读<JavaScript启示录>,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪浅. 那么我们先来聊一下JavaScr ...

  10. 团队作业8——第二次项目冲刺(Beta阶段)--第三天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 学号 成员 贡献比 201421123001 廖婷婷 16% 201421123002 翁珊 16% 201421123004 ...