本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html

XAgent是新生命开发团队X组件的其中一个项目,石头今天在群里揭开了其神秘的面纱,很多的不懂和不解,总结成此文,以备后用。

1.XAgent的基本介绍

1.1 XAgent的来源

XAgent是一个服务代理程序,它出现的初衷,是为了解决写Windows服务不方便的问题。因为用Visual Stuido写的Windows服务程序,需要创建一个特殊的项目,安装的时候还需要特殊的命令,所以对新手来说,非常繁琐,跟令人讨厌的是不好调试(也许你有好的方法,但是要让更多人,短时间掌握是有难度的)。试问,多少人会去挂载一个Windows服务进程进行调试么?所以,XAgent横空出世!所谓Windows服务程序,一点也不特别,完完全全就是一个exe。

1.2 第一代XAgent

一个普通的应用程序,比如WinForm也可以做服务程序。XAgent是一个控制台写的exe程序,只不过它继承了Service类。控制器启动这个类,再用sc命令安装到服务里面,这样服务就可以很好的工作了。XAgent开头就检查参数,如果这个exe附带了参数,就进行特殊操作;如果没有参数,就启动一个菜单;没有参数的时候,就显示如下这个界面:

2,4,5很重要。其中-i参数,就表示安装服务。有2种安装方式,1种是命令行 Test.exe -i;另一种是先启动Test.exe,然后按2键。按2以后,是下面这个样子:

-i就可以把当前exe安装到服务里面,Test.exe -run,带有参数,这样子,Windows服务启动 的时候,其实是带有-run参数的。3就是启动了,所以,用XAgent,根本就不需要写安装卸载的脚本命令。重点看看4,5点功能:

XAgent的设计中,有一个大大的StartWork/StopWork,代表服务的开始和停止,循环调试调用的就是它们。StartWork里面开一个线程,定时调用Work(index)函数,单步调试就是调用Work,所以支持轮询式服务;如果用4,就调用一次work,相当于执行一次轮询。这样就很方便我们调试代码了,因为现在是控制台状态,而业务代码在work里面。所以业务代码可以供多个方面使用:
1.控制台调用
2.Windows服务调用
3.调试调用

在XAgent里面,只要你在控制台下调试业务代码没有问题,到了Windows服务里面,也没有问题,这就是第一代XAgent。

2.第二代XAgent

XAgent可以挂载无数个Windows服务,也就是它注册成为一个Windows服务程序,但是里面可以含有很多个服务。第一代XAgent很烂,但有很重要的意义。第二代XAgent,每个服务有自己的StartWork/Work(index)/StopWork。然后XAgent会启动一个管理线程,拥有最高优先级,每个服务的循环都有一个逻辑线程,普通优先级,管理线程会实时监控每一个工作线程的资源状况,以及整个服务程序的资源状况。配置文件有监控指标:

如果工作线程超过时间没有向管理线程汇报,那么管理线程会把它干掉,重新启动XAgent.MaxActive,如果占用内存、线程数过高,XAgent干脆让整个服务重启XAgent.AutoRestart是自动重启时间;XAgent的重启绝对不是简单重启,它重启之前,会停止所有工作线程的轮询,也就是等每个线程完成当前的work(index)。一次轮询就是最小工作颗粒,只要你在这次work里面做好你的事情,就不会造成数据丢失。管理线程等所有线程的work完成了才会真正重启服务的,这是一个最高优先级的调度,避免有的工作线程开小灶,自己开线程不受管制,XAgent.AutoRestart就是定时重启的功能。理论上,99.9%的服务程序,只要每天得到重启一次,就可以无限的工作下去。

3.第三代XAgent

第二代XAgent还是不够完美,从第三代开始,加上了“看门狗”功能。看下图:

双服务或者多个服务互相监视,每一个用XAgent做的服务程序都带有这个功能,真正的产品里面,最少用两个Windows服务,分为AB两个,A的看门狗监视B,B的看门狗监视A,谁也不会死;如果环境过于恶劣,你不妨多开几个小伙伴;XAgent的看门狗有漏洞,那就是,AB互相监视以后,谁也灭不了它……,你必须赶在另一个启动它之前把两个进程都干掉。其实可以开个小门的,发现特殊通道进去的就退出,不要监视,禁用也不行,XAgent会重新把它启用,这样子,用XAgent写的程序,就有了不死之身,所以我说XAgent是网络程序的最佳搭档。

XAgent修改架构,从DLL变成了Exe,因为XAgent已经很成熟,没有什么必要扩展了。我们要写Windows服务的时候,只需要建立一个类,实现IService接口,这个接口在核心库里面,然后在XAgent配置文件配置一下,XAgent就会加载你的服务类,直接启动,我们自己根本就不用写exe项目。比如我们做一个网站,突然要用到一个很小的功能,需要Windows服务,这个时候,我们干脆在业务类库里面加上一个实现了IService的类,配置好XAgent,XAgent就可以安装Windows服务了,这就是第三代XAgent。

4.总结

1.它自身是控制台程序,可以注册成为Windows服务,但是,它带有WinForm类,可以在登录用户的右下角有个小图标,用户可以通过它呼出一个WinForm设置界面,然后你就可以做你想做的事情。

2.XAgent在实现一个简单的HttpServer,支持用户通过浏览器访问控制服务,不支持ASP.Net,但是支持XTemplate;有了这个HttpServer,XAgent就可以分布式协同调度了。

看一段示例代码吧,关于X组件的其他和下载可以看我的博客其他文章。

 namespace XAgent
{
/// <summary>代理服务例子。自定义服务程序可参照该类实现。</summary>
class AgentService : AgentServiceBase<AgentService>
{
#region 属性
/// <summary>线程数</summary>
public override int ThreadCount { get { return ; } } /// <summary>显示名</summary>
public override string DisplayName { get { return "新生命服务代理"; } } /// <summary>描述</summary>
public override string Description { get { return "用于承载各种服务的服务代理!"; } }
#endregion #region 构造函数
/// <summary>实例化一个代理服务</summary>
public AgentService()
{
// 一般在构造函数里面指定服务名
ServiceName = "XAgent";
}
#endregion #region 核心
/// <summary>核心工作方法。调度线程会定期调用该方法</summary>
/// <param name="index">线程序号</param>
/// <returns>是否立即开始下一步工作。某些任务能达到满负荷,线程可以不做等待</returns>
public override bool Work(int index)
{
// XAgent讲开启ThreadCount个线程,0<index<ThreadCount,本函数即为每个任务线程的主函数,间隔Interval循环调用
//WriteLine("任务{0},当前时间:{1}", index, DateTime.Now); return false;
}
#endregion
}
}

【总结】探索Newlife组件:服务代理利器XAgent的前世今生的更多相关文章

  1. 探索解析微服务下的RabbitMQ

    概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...

  2. Nepxion Discovery【探索】微服务企业级解决方案

    Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...

  3. win7 64位DCOM配置(关于导出excel 配置计算机组件服务)(转)

    http://blog.sina.com.cn/s/blog_9323b3a50101qrxm.html [解决方案1] 1:在服务器上安装office的Excel软件. 2:在"开始&qu ...

  4. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  5. MQTT客户端与服务代理的案列

    服务端,采用 Mosquitto 来转发分发消息. 客户端自己写. 服务端 启动 mosquitto (底下的命令是我自己放到环境变量里面的,通过alias 运行mosquitto) Ishallbe ...

  6. WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法

    转自:http://blog.csdn.net/lploveme/article/details/8215265 在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Micro ...

  7. WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?

    原文:WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果? 我们想对WCF具有一定了解的人都会知道:在客户端通过服务调用进行服务调用过程中,服务代理应该及时关闭.但是如果服务的代理不等得到及时的 ...

  8. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  9. 安装完office后 在组件服务里DCOM配置中找不到

    这个主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组件了

随机推荐

  1. 学习django之构建Web是Meta嵌套类的几处使用

    Django中meta嵌套类的使用 1.模型中使用嵌套类 在定义抽象模型时如: class Meta : abstract=true 用来指明你创建的模型是一个抽象基础类的模型继承. 2.在一个对象对 ...

  2. 在已有 Xcode 项目中 加入Cordova框架

    转自:http://www.jianshu.com/p/656838ae92bc 我们知道,在UIKit中的UIWebView虽然已经提供了很多功能了,比如JavaScript和Objc之间的通信.但 ...

  3. [原] XAF 如何启用ListView Top N records 提升用户使用体验

    為了提升用戶使用體驗,特擴展此功能(來源與Xafari Framework).1.可在模型編輯器中設置是否啓用,默認啓用.2.DataAccessMode為Client模式才啓用.其它模式自動關閉.3 ...

  4. SAP HANA专题分析目录

    针对HANA的关键技术领域, 做深度解析. 1. HANA开发规范 HANA 各种对象的应用解析.版本管理,开发规范. 2. HANA系统管理 用户.系统权限.数据权限的深度解析. HANA系统配置. ...

  5. xpath实例 --//span[contains(.,'资讯管理')]

    实际例子: 实例一: 不得不说下第一个例子,谢谢selenium论坛的大神门,XPATH还有这种方式的定位,传说是“治疗一切跌打损伤,及text找不到”(Antony群友帮解决的,在此谢谢)

  6. Android ExpandableListView

    ExpandableListView 结合SimpleExpandableListAdapter用法 最终实现效果: activity_main.xml <?xml version=" ...

  7. Angular Input格式化

    今天在Angular中文群有位同学问到:如何实现对input box的格式化.如下的方式对吗? <input type="text" ng-model="demo. ...

  8. [.net 面向对象编程基础] (23) 结束语

    [.net 面向对象编程基础] (23)  结束语 这个系列的文章终于写完了,用了半个多月的时间,没有令我的粉丝们失望.我的感觉就是一个字累,两个字好累,三个字非常累.小伙伴们看我每篇博客的时间就知道 ...

  9. 基础调试命令 - wt (watch and trace)

    本文介绍windbg动态调试过程中一个非常有用的命令,wt的用法. wt命令 wt命令之所以称为wt是因为它是watch and trace的简称,即用来观察和跟踪的命令.这个命令一般用在动态调试而不 ...

  10. Perl重命名当前目录下的文件

    下载的zip包解压后,中文都变成了乱码,就写了个脚本重命名文件. use strict; use warnings; use Cwd; sub main { my $dir = getcwd(); o ...