HTML5技术

VS2013写window服务,实现定时短信功能 - 风徐徐

字号+ 作者:H5之家 来源:博客园 2016-01-18 11:12 我要评论( )

好久没来了,说要写博的,但人懒一直没写过。最近做一个功能,这样的可能以后很少用到,时间久不用,可能还会忘记,还是写篇记录下来吧。 公司业务里,有一项需求,需要监控数据库里的某些数值,当数值减少到预设值时,就通过短信提醒用户,这种功能做在IIS

好久没来了,说要写博的,但人懒……一直没写过。最近做一个功能,这样的可能以后很少用到,时间久不用,可能还会忘记,还是写篇记录下来吧。

公司业务里,有一项需求,需要监控数据库里的某些数值,当数值减少到预设值时,就通过短信提醒用户,这种功能做在IIS上似乎不太稳定,如果IIS重启之类的,就经常会出现一些问题。后来就想,能否做成windows的服务,只要服务器开着,这项服务就随系统开启启动,不受其他影响。

随后就实现了这个功能。

 

第一步,新建一个windowsService服务

在windows桌面下,有windows服务,项目名称自定义吧。我就改成公司项目的名称了Fanso2o_MonitoringActivity

 

第二步,先写业务吧,单击切换到代码视图吧。

 

第三步,业务处理

 

哎呀,截图太麻烦了,直接上代码。

Service1 : ServiceBase 2 { List<UserMonitor> user = new List<UserMonitor>(); Timer timer = new Timer(1800000); 8 public Service1() 9 { 10 InitializeComponent(); 11 } 服务启动,执行定时检查任务。 OnStart(string[] args) 17 { timer.Elapsed += new ElapsedEventHandler(Time); 20 timer.AutoReset = true; 21 timer.Enabled = true; 22 } 服务关闭 OnStop() 28 { 29 timer.Close(); 30 timer.Dispose(); 31 32 } 服务重启 OnContinue() 38 { 39 timer.Start(); 40 base.OnContinue(); 41 } 服务暂停 OnPause() 47 { 48 timer.Stop(); 49 base.OnPause(); 50 } 执行业务的方法 Time(object source, System.Timers.ElapsedEventArgs e) 58 { 59 await MonitoringActivity(); 60 } 具体业务的异步方法 Task<bool> MonitoringActivity() 67 { Task.Run<bool>(() => 69 { defaultSmsService = new DefaultSmsService(); 72 var activityMonitorDao = new MongoCommonDao<ActivityMonitor, string>(); 73 var groupDao = new MongoCommonDao<CompanyResourceGroup, string>(); 74 var resourceDao = new MongoCommonDao<CompanyResource, string>(); 75 var monitorList = activityMonitorDao.Set.FindAll().ToList(); group = 78 groupDao.Set.Find(Query<CompanyResourceGroup>.In(x => x.Id, 79 monitorList.Select(c => c.ActivityGroupid))) , , }).ToList(); 81 monitorList.ForEach(x => 82 { 83 x.MonitorPerson.ForEach(c => 84 { 85 if (user.All(y => y.Name != c.MonitorName && y.Phone != c.Phone)) 86 { 87 var u = new UserMonitor 88 { 89 Phone = c.Phone, 90 Name = c.MonitorName, 91 CompanyGroup = new List<CompanyResourceGroup>(), 92 count = 0, 93 SenCount = -1 94 }; 95 user.Add(u); 96 } 97 var g = group.Find(h => h.Id == x.ActivityGroupid); 98 if (g != null && g.Residue <= 50) 99 { 100 var index = user.FindIndex(h => h.Name == c.MonitorName && h.Phone == c.Phone); 101 if (index>-1&&user[index].CompanyGroup.All(h => h.Id != x.ActivityGroupid)) 102 { 103 user[index].count++; 104 user[index].CompanyGroup.Add(g); 105 } 106 } (g != null && g.Residue > 50) 108 { 109 var index = user.FindIndex(h => h.Name == c.MonitorName && h.Phone == c.Phone); 110 if (index > -1 && user[index].CompanyGroup.Any(h => h.Id == x.ActivityGroupid)) 111 { 112 user[index].CompanyGroup.RemoveAll(h => h.Id == x.ActivityGroupid); 113 user[index].count--; 114 } 115 } 116 }); 117 }); 118 if (user.Any()) 119 { 120 var smsStr = new List<SmsModel>(); 121 user.ForEach(x => 122 { 123 if (x.count > 0 && x.SenCount < x.count) 124 { 125 var m = new SmsModel(); 126 m.PhoneList = x.Phone; 127 m.SmsStr.Add(x.count.ToString()); 128 var str = new StringBuilder(); 129 var num = x.CompanyGroup.Count > 3 ? 3 : x.CompanyGroup.Count; 130 for (int i = 0; i < num; i++) 131 { ); 133 } 134 m.SmsStr.Add(str.ToString()); 135 x.SenCount = x.count; s = defaultSmsService.SendValidateCode(m.PhoneList, m.SmsStr); 139 Console.WriteLine(s); 140 } 141 }); 142 } ; 144 }); 145 } 146 } 一些用到的类 UserMonitor 152 { Name { get; set; } Phone { get; set; } count { get; set; } SenCount { get; set; } 157 public List<CompanyResourceGroup> CompanyGroup { get; set; } UserMonitor() 160 { 161 this.CompanyGroup = new List<CompanyResourceGroup>(); 162 this.Name = string.Empty; 163 this.Phone = string.Empty; 164 this.count = 0; 165 this.SenCount = -1; 166 } 167 } 一些用到的类 SmsModel 173 { PhoneList { get; set; } 175 public List<string> SmsStr { get; set; } SmsModel() 178 { 179 PhoneList = string.Empty; 180 SmsStr = new List<string>(); 181 } 182 }

windows服务的具体业务代码

 

业务处理完,就在service1中添加安装程序

第五步,在设置中,添加安装程序。会出现下图:

这两个是服务安装的一些组件。

第六步,分别在这两个组件上鼠标右键,选择属性,进行相应的设置。

displayName是服务显示在服务列表中的名字,可以根据需要填写。

serviceName是服务执行注册到系统中的名字,不可与其他服务重名。如果displayName没填写,那显示在服务列表中的,将是此属性中的名字。

starType是设置服务运行的方式,可以进行选择。

Account是服务的启动方式,也可以进行选择,LocalSystem是随系统启动而自动启动。

第七步,业务处理完毕后,就生成服务(最好用管理员权限运行VS2013,此处是个坑,害我检查了好久,我的不知道为什么,必需用管理员权限生成的,安装服务时,才不会报错,否则就有问题。)

第八步,服务生成完毕后,打开bin\Debug目录,新建两个文本文件,一个用来安装服务,另一个用来删除服务的。

           

 

Install.text里面放如下代码:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • net.sz.framework 框架 登录服务器架构 单服2 万 TPS(QPS) - 失足程序员

    net.sz.framework 框架 登录服务器架构 单服2 万 TPS(QPS) - 失足

    2017-04-13 11:05

  • 面向个人的技术咨询服务 - 思想瞭望者

    面向个人的技术咨询服务 - 思想瞭望者

    2017-04-05 12:07

  • net.sz.framework 框架 轻松搭建服务---让你更专注逻辑功能---初探 - 失足程序员

    net.sz.framework 框架 轻松搭建服务---让你更专注逻辑功能---初探 -

    2017-04-02 10:11

  • 微服务--webapi实现,脱离iis,脱离tomcat - 失足程序员

    微服务--webapi实现,脱离iis,脱离tomcat - 失足程序员

    2017-03-30 11:00

网友点评