博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现
阅读量:4697 次
发布时间:2019-06-09

本文共 3565 字,大约阅读时间需要 11 分钟。

前言

前两篇《》、《》分别讲解了API提供服务与SDK调用API实现。

本篇会继续讲解Sikiro.SMS.Bus的服务实现,此实现是基于开篇的架构设计的拥有调度任务服务,在最后一篇会给架构优化的,抛弃了调度任务服务使用MQ代替。

源码地址:https://github.com/SkyChenSky/Sikiro.SMS

功能流程描述

如上图所示,消费者订阅到消费消息后,通过工厂类创建出对应的短信运营商类,通过调用Send方法进行对短信运营商服务请求,得到响应结果后对持久化数据的状态进行更新。假如中途遇到异常则回滚数据状态,等待下一次调度任务进行调度。

下面是MainService的代码示例:

public class MainService : IMicroService    {        private readonly IBus _bus;        private readonly SmsService _smsService;        public MainService(IBus bus, SmsService smsService)        {            _bus = bus;            _smsService = smsService;        }        public void Start()        {            Console.WriteLine("I started");            _bus.Subscribe
("", msg => { try { _smsService.Send(msg.MapTo
()); } catch (Exception e) { _smsService.RollBack(); e.WriteToFile(); } }); } public void Stop() { ConfigServer.Container?.Dispose(); Console.WriteLine("I stopped"); } }

 

下面是SmsService的代码示例:

public void Send(SmsModel item)        {            Sms = item;            var isSuccess = _smsFactory.Create(item.Type).SendSMS(item.Mobiles, item.Content, _configuration["Sms:SignName"]);            if (isSuccess)                Success(item.Id);            else                Fail(item.Id);        }        public void RollBack()        {            RollBack(Sms.Id);        }        public void RollBack(string id)        {            _mongoProxy.Update
(a => a.Id == id, a => new SmsModel { Status = SmsEnums.SmsStatus.待处理 }); } private void Success(string id) { _mongoProxy.Update
(a => a.Id == id, a => new SmsModel { Status = SmsEnums.SmsStatus.成功 }); } private void Fail(string id) { _mongoProxy.Update
(a => a.Id == id, a => new SmsModel { Status = SmsEnums.SmsStatus.失败 }); }

 

组件选择

宿主框架

对于有在.Net Framework上开发Windows服务的朋友对TopShelf应该会很熟悉。

优势主要体现下面三点:

  • 基于控制台应用
  • 调试方便
  • 易于安装部署

不少人认为,Core的出现,跨平台加命令行的优势,可以轻易的在Linux部署守护进程。难道还需要宿主框架?

然而并不是所有公司选用了Linux系统的服务器,就像我们公司。既然使用了Windows服务器应该将他部署为Windows服务使其可视化方便管理,另外没有等待到TopShelf的Core版本,因此我选择了另一款宿主框架:PeterKottas.DotNetCore.WindowsService

PeterKottas.DotNetCore.WindowsService

源码地址:https://github.com/PeterKottas/DotNetCore.WindowsService

虽然比不起TopShelf的功能强大,但是对于一般的需求使用基本满足,而且使用方式也与TopShelf相似。下面是使用示例:

class Program    {        static void Main(string[] args)        {            ServiceRunner
.Run(config => { config.SetServiceInfo(); config.Service(serviceConfig => { serviceConfig.UseAutofac(); serviceConfig.UseServiceFactory(); serviceConfig.OnStart((service, extraParams) => { service.Start(); }); serviceConfig.OnStop(service => { service.Stop(); }); serviceConfig.OnError(Console.WriteLine); }); }); } }

下面是安装卸载的命令示例:“

dotnet Sikiro.SMS.BUS.dll action:installdotnet Sikiro.SMS.BUS.dll action:uninstall

结尾

这里就是本篇的内容,相比于前面几篇的内容相对少点,如果有中途来看的朋友可以把《》看看作个补充,如果有任何建议,可以在下方评论反馈给我。

 

转载于:https://www.cnblogs.com/skychen1218/p/9621815.html

你可能感兴趣的文章
Oauth支持的5类 grant_type 及说明
查看>>
ASP.NET 5 DNX SDK删除旧版本
查看>>
Android ListView 九大重要属性详细分析
查看>>
CC++中sizeof函数的用法
查看>>
SPFA 算法详解( 强大图解,不会都难!) (转)
查看>>
QUIC:基于udp的传输新技术
查看>>
java常见面试题及部分答案
查看>>
动态添加方法的代码分析
查看>>
thinkPHP5.0使用模型新增数据
查看>>
客户端第一天学习的相关知识
查看>>
LeetCode - Same Tree
查看>>
Python dict get items pop update
查看>>
[置顶] 程序员必知(二):位图(bitmap)
查看>>
130242014036-(2)-体验敏捷开发
查看>>
constexpr
查看>>
Nginx 流量和连接数限制
查看>>
课堂作业1
查看>>
IE8/9 本地预览上传图片
查看>>
Summary of CRM 2011 plug-in
查看>>
Eclipse+Maven环境下java.lang.OutOfMemoryError: PermGen space及其解决方法
查看>>