措施员的自我救赎

时间:2021-08-09 07:15:13

(一) Winner2.0 框架根本分析

(二)PLSQL报表系统

(三)SSO单点登录

(四) 短信中心与动静中心

(五)钱包系统

(六)GPU付出中心

(七)权限系统

(八)监控系统

(九)会员中心

(十) APP版本控制系统

(十一)Winner前端框架与RPC接口规范讲解

(十二)上层应用案例

(十三)总结

《WinService处事》

说道Windows处事根基每个以.net为主要开发语言的技术团队城市用到这个,Winner2.0中对付WinServices也有一些与众差此外处所。

正常来说,每次开发一个项目如果我们要用到Windows处事就要单独在项目下成立一个WinService。其实WinService 就是一个壳子。

但是每次为了这个壳子都要投产随处事器还要通过cmd命令去部署。

因为一直习惯这么做,可能不会感受麻烦,但是项目一多就会发明要部署几十个处事那不那么顺心了。所以Jason开发了一套“WinServiceJob”工具。

先说说有点再说是怎么实现的:

1,无需新建WinService处事项目。

2,无需cmd命令部署。

3,更新无需遏制处事。

从思路上来说,Jason开发的WinServiceJob思路和《短信中心》是一样的(自己两个项目也都是Jason开发的)。

简单讲就是 WinServiceJob 是一个类似Docker的容器,它自己不做任何业务。具体业务是读取数据库的配置然后反射措施集来执行的。

措施员的自我救赎

WinServiceJob ,就是个空壳子。所有项目只需要编译一个service措施集然扔到 WinServiceJob 项目下,然后数据库一配置WinServiceJob 就会

帮我们去执行事情,,这里可以通过Cycle字段来配置执行周期,是一天一次还是60分钟一次。每次执行完一个处事之后更新NextRunTime生存下一次

执行时间。

这样省去了措施员们每次开发Windows 处事时的琐碎工作,只需在当前开发项目编译一个要执行的service.dll 然后交给WinServiceJob 打点人员

就行了。看了前面《短信中心》讲解的就应该很清楚,要撑持这种写法必需要求所有的执行项目要担任接口约束。

using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Winner.Job.Master.Interface { /// <summary> /// WinService事情单元接口 /// </summary> public interface IJob { /// <summary> /// 执行事情单元 /// </summary> /// <param></param> /// <returns>返回执行功效JobResult</returns> JobResult Run(DateTime runTime); } }

两个值得一说的处所:

1,WinServiceJob更新时处事无需重启;

2,WinServiceJob可以在处事器上部署多个;

这两个处所实现的方法也很特殊,先来看一段代码:

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Remoting.Lifetime; using System.Text; using System.Threading.Tasks; using Winner.Job.Master.Interface; namespace Winner.Job.Master.Remoting { /// <summary> /// 长途措置惩罚惩罚的应用措施中跨应用措施域界限访谒东西。 /// </summary> public class RemoteLoader : MarshalByRefObject { private Assembly _assembly; public void LoadAssembly(string assemblyFile) { try { _assembly = Assembly.LoadFrom(assemblyFile); } catch (Exception ex) { throw ex; } } public T GetInstance<T>(string typeName) where T : class { if (_assembly == null) return null; var type = _assembly.GetType(typeName); if (type == null) return null; return Activator.CreateInstance(type) as T; } public JobResult ExecuteMothod(string typeName, DateTime? runtime) { if (_assembly == null) { return JobResult.FailResult("加载措施集掉败"); } var type = _assembly.GetType(typeName); var obj = Activator.CreateInstance(type); IJob job = obj as IJob; return job.Run(runtime.HasValue ? runtime.Value : DateTime.Now); } public override object InitializeLifetimeService() { ILease aLease = (ILease)base.InitializeLifetimeService(); if (aLease.CurrentState == LeaseState.Initial) { // 不过期:TimeSpan.Zero aLease.InitialLeaseTime = TimeSpan.FromMinutes(1000); } return aLease; } } }

这是一个长途挪用的工具类,每个子处事中必需把这个措施集放到目录下,主处事拿子处事的目录下RemoteLoader来获取子处事的信息,

准确来说是处事名: