[短彩信]C#短彩信模块开发设计(2)——配置

准备从以下几个方面简单的谈谈短彩信模块的实现:

[短彩信]C#短彩信模块开发设计(1)——架构(http://www.cnblogs.com/CopyPaster/archive/2012/12/07/2806776.html)
[短彩信]C#短彩信模块开发设计(2)——配置(http://www.cnblogs.com/CopyPaster/archive/2012/12/10/2811626.html)
[短彩信]C#短彩信模块开发设计(3)——协议(http://www.cnblogs.com/CopyPaster/archive/2012/12/12/2814918.html)
[短彩信]C#短彩信模块开发设计(4)——其他(http://www.cnblogs.com/CopyPaster/archive/2012/12/17/2821715.html)

      现在来说说配置,其实短彩信服务,抛开协议和通讯方式的差异外,整个处理过程是相似的,或者说基本一样(当时在写彩信服务的时候一度想把二者通过接口抽象写到一个服务里去,不过从服务应职责单一原则和维护的角度来讲,最终还是分开为好)。所以,这里以我在一个项目中短信模块的配置来作为示例。本文的目的仅仅是希望大家通过配置的角度去看短彩信服务应该包括那些功能,另外一点就是跟前一次Blog去做一些具体的呼应。大家不用去一一关注我这里示范的所有配置(毕竟有些特定业务相关),可以根据自己实际情况参考和取舍,当然大家对于遗漏进行补充。

     下面现先看看配置(为了不依赖数据库,索性全部基于xml,从多套服务共同部署运行的角度来讲,一些配置节点集合写入一个全局数据库其实更合理;至于程序中如何将xml和相应对象的互相转化,做法太多,第三方的、根据一定规则反射的……,这里不介绍了):

<SMSAConfig><SysConfigItem ServiceCode="CSMA" RemotingServerPort="8085" MachineID="1" ResendTimeout="30000" ResendCount="3" ActiveTestPeriod="20" DefaultIsmgID="CN.cq.1." MoToAmqThreadCount="3" MtRespToAmqThreadCount="3" MtReplyToAmqThreadCount="3" AmqRetrySecond="60" MobileSplitString="," ServiceIntervalSecond="45"/><AmqConnectionConfigItems><Item QueueServerCode="QueueServer1" UserID="u1" Password="w1" SleepSecond="10" ConnectionCount="5" BrokerUri="tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=0&amp;maxInactivityDurationInitalDelay=30000&amp;connection.AsyncSend=false"/></AmqConnectionConfigItems><AmqQueueConfigItems><Item QueueType="ResultMediaTask" QueueName="result.mediatask"/><Item QueueType="ResultSendReport" QueueName="result.sendreport"/><Item QueueType="MoQueue" QueueName="mo.queue"/></AmqQueueConfigItems><ApplicationConfigItems><Item AppCode="MultiPush.1." AppQueueName="mt.multipush1" BeginReceiveTime="08" EndRecevieTime="22" /><Item AppCode="MultiPush.2." AppQueueName="mt.multipush2" BeginReceiveTime="08" EndRecevieTime="22" /><Item AppCode="MultiPush.3." AppQueueName="mt.multipush3" BeginReceiveTime="08" EndRecevieTime="22" /><Item AppCode="SendTask." AppQueueName="mt.sendtask" BeginReceiveTime="00" EndRecevieTime="24"/></ApplicationConfigItems><IsmgServerConfigItems><Item ID="CN.hn.1." IpAddress="127.0.0.1" Port="7890" SpCode="916086" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/><Item ID="CN.js.1." IpAddress="127.0.0.1" Port="7890" SpCode="910680" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/><Item ID="CN.hb.1." IpAddress="127.0.0.1" Port="7890" SpCode="917339" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/><Item ID="CN.cq.1." IpAddress="127.0.0.1" Port="7890" SpCode="922198" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/><Item ID="CN.sx.1." IpAddress="127.0.0.1" Port="7890" SpCode="926536" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/><Item ID="CN.gd.1." IpAddress="127.0.0.1" Port="7890" SpCode="419901" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/><Item ID="CN.nm.1." IpAddress="127.0.0.1" Port="7890" SpCode="905331" SharedSecret="pw" MoConnectionCount="1" MtConnectionCount="1" CanWappush="False" ComputerWorker="1" MaxSendCount="20000" IntelligentSlowing="False"/></IsmgServerConfigItems><MachineConfigItems><Item MachineID="1" IP="127.0.0.1" Port="8085"/>
   <Item MachineID="2" IP="192.168.1.10" Port="8085"/></MachineConfigItems><RegionIsmgMappingConfigItems><Item ID="1" RegionCode="CN.hn." IsmgID="CN.hn.1." /><Item ID="2" RegionCode="CN.js." IsmgID="CN.js.1." /><Item ID="3" RegionCode="CN.hb." IsmgID="CN.hb.1." /><Item ID="4" RegionCode="CN.cq." IsmgID="CN.cq.1." /><Item ID="5" RegionCode="CN.sx." IsmgID="CN.sx.1." /><Item ID="6" RegionCode="CN.gd." IsmgID="CN.gd.1." /><Item ID="7" RegionCode="CN.nm." IsmgID="CN.nm.1." /></RegionIsmgMappingConfigItems><RegionConfigItems><Item RegionID="594463261" RegionCode="CN.hn." /><Item RegionID="594463294" RegionCode="CN.js." /><Item RegionID="594463243" RegionCode="CN.hb." /><Item RegionID="1168" RegionCode="CN.cq." /><Item RegionID="1177" RegionCode="CN.sx." /><Item RegionID="86564469" RegionCode="CN.gd." /><Item RegionID="1172" RegionCode="CN.nm." /></RegionConfigItems></SMSAConfig>

SysConfigItem 

ServiceCode:服务代码,日志分类、监控信息等需要用到;
RemotingServerPort:Remoting监听端口;《[短彩信]C#短彩信模块开发设计(1)——架构》里说过,如果分省接入,然后配置又不是每套服务都能处理所有网关,就需要消息跨机跳转;这里用的的.net remoting,当然了比较老气,改为RPC的方式更好;
MachineID:当前服务部署机器的ID,在跨机的时候也需要用到;
ResendTimeout:超时重发时间;
ResendCount:最大重发次数;
ActiveTestPeriod:与网关的心跳间隔(单位:秒)
DefaultIsmgID:默认网关ID;如果分省接入的时候,如果某个消息对应不到网关,则发给某认网关,一般配置为一级网关;
MoToAmqThreadCount:上行写入Amq队列线程数;《[短彩信]C#短彩信模块开发设计(1)——架构》里说过Amq的收发原则;
MtRespToAmqThreadCount:下行写入Amq队列线程数;
MtReplyToAmqThreadCount:状态报告写入Amq队列线程数;
AmqRetrySecond:Amq失败重连间隔(当某个连接坏了的时候,自动重连时间间隔)
MobileSplitString:短信群发,手机号分隔符号(实际从cmpp2.1之后兼容了短信群发,协议中接收手机号码是支持数组的,不过我们在项目中没有使用,即使上层应用传过来的群发手机号,实际的处理也是split成了N条消息给网关的);
ServiceIntervalSecond:服务定时间隔(主要是配合监控系统使用,一到这个配置时间,服务会给监控服务发送心跳);

 

AmqConnectionConfigItems (Amq连接配置)

主要来配置Amq队列的连接信息,从上面大家应该能看出:
1)我们使用了需要用户名/密码的方式去连接;
2)采用同步方式收发消息;
SleepSecond:如果队列消息收空了,休眠时间;

 

AmqQueueConfigItems(Amq队列配置集)

代码中定义了一个QueueType的枚举,根据此枚举确定将回执/状态报告/上行发送到Amq的哪个队列之中;
QueueType:队列类型;
QueueName:Amq队列名称;

ApplicationConfigItems(下行应用配置集)

业务中需要将某些消息在某些时间段内不发送,AmqLisenter如果发现某个队列的配置不在规定时间之前,则停止接收消息,通过这样的方式控制,不向网关发送消息;
AppCode:应用名称;
AppQueueName:应用Amq队列名称;
BeginReceiveTime:开始接受时间;
EndRecevieTime:结束接收时间;

 

IsmgServerConfigItems(网关配置集)

ID:网关ID(本地MSMQ队列会根据此命名和自动创建)
IpAddress:网关IP;
Port:网关端口;
SpCode:连接鉴权用户名(网关用SpCode来区分接入的Sp,一般在连接鉴权时的用户名字/密码,用户名都用spcode,所以配置名称干脆做成了SpCode);
SharedSecret:连接鉴权密码;
MoConnectionCount:上行连接数;
MtConnectionCount:下行连接数;
CanWappush:是否支持Wappush;(wappush实际就是一种特殊短信)
ComputerWorker:这里其实就是配置是否所有服务能跑所有网关了;逗号切分;
MaxSendCount:单连接的最大发送速度;
IntelligentSlowing:是否智能降速(如果配置为true,则不根据MaxSendCount进行流控;);


备注:

1)之所以要流控,就是因为如果发送过快,会把网关“压跨”,往往的结果就是网关表现越差,发送约慢,而且这个慢一般非线性,是种激增;但是有时候高于网关给的流控阀值,网关也没有表现出差,所以如何充分利用网关性能提高发送速度呢?智能降速就是一种方法。所谓智能降速就是,只要网关表现好,我就发;一旦网关表现不好(其实就是看下行延迟),我就降低速度;关于流控和智能降速,打算在第4次来说([短彩信]C#短彩信模块开发设计(4)——其他);之前大家很关心的如何提高短彩信发送速度,这就是一种优化方案。

2)如果分省接的话,可能会遇到有些省同一个端口不同时支持上行和下行(现在华为,东软,亚信,深讯啥的都做个一些省的网关;像深讯就是这样用端口区分上下行);所以在配置网关的时候,有些省可能需要配置2条信息;处理上行的把MtConnectionCount配成0(一般是7910) ,只处理下行的把MoConnectionCount配成0就可以了(一般是7890)。ID可以配置成CN.xx.1.\CN.xx.2.

 

MachineConfigItems

就是配置机器ID、IP、端口了没啥好说(跨机的时候需要使用此配置)


RegionIsmgMappingConfigItems/RegionConfigItems

这两个配置集,主要是我们项目中,上层应用传过来的省代码是数字(RegionID),短信服务需要配置本地MSMQ使用,程序会自动创建和使用各个队列,那么用数字显然可读性不高,所以用RegionCode比较直观(RegionCode也是本地MSMQ队列名称的一部分);RegionIsmgMappingConfigItems则是把省和网关对应起来;

转载于:https://www.cnblogs.com/CopyPaster/archive/2012/12/10/2811626.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python管理工具ports_Python options.port方法代码示例

本文整理汇总了Python中tornado.options.port方法的典型用法代码示例。如果您正苦于以下问题&#xff1a;Python options.port方法的具体用法&#xff1f;Python options.port怎么用&#xff1f;Python options.port使用的例子&#xff1f;那么恭喜您, 这里精选的方法代码示例或…

html5 canvas文字颜色,我可以通过HTML5 Canvas中的字符文本颜色来做吗?

我告诉你这个解决方法.基本上你一次输出一个字符,并使用内置的measureText()函数来确定每个字母的宽度.然后我们将我们想要绘制的位置偏移相同的数量.您可以修改此代码段,以产生所需的效果.假设我们有这样的HTML&#xff1a;和Javascript一样&#xff1a;var canvas document.…

转移指令总结

转移指令&#xff1a;可以修改ip的指令。无条件转移 jmp(1) jmp short s 标号&#xff0c;短转移&#xff1a;用一个字节表示大小&#xff0c;范围为-128--127 (2) jmp near ptr s 标号&#xff0c;近转移&#xff1a;用两个字节表示大小&#xff0c;范围为-32768--32767(3) …

浅谈对程序员的认识_浅谈IT界程序员大佬普遍对性的追求

原标题&#xff1a;浅谈IT界程序员大佬普遍对性的追求业界程序员大佬跟普通程序员的差别&#xff0c;别的不说&#xff0c;对于完成一个需求来说&#xff0c;除了更少的 bug&#xff0c;还有什么优势&#xff1f;还有程序员对性的追求。下面谈谈最顶级的程序员对20个性的追求可…

乔治敦大学计算机专业排名,2020USNEWS数据科学与分析专业综合排名(上)

2020年USNEWS专业排名已经陆续放出了&#xff0c;今天慧德留学就带大家看一下2020年美国USNEWSS数据科学与分析专业的综合排名&#xff0c;供大家参考。独立项目综合排名 学校名称 专业名称 专业英文名 开设学位 所属科系1 哈佛大学 计算科学与工程 Computational Science and …

Javascript事件绑定this

在FF中的事件绑定是使用addEventListener&#xff0c;其中函数中的this就是被绑定事件的元素&#xff1b;而在IE下的attachEvent函数中的this是指window。 DRY&#xff1a;Don‘t Repeat Yourself&#xff1b; 对于自己声明的函数&#xff0c;如果参数是多个&#xff0c;并且可…

python xlutils教程_Python基于xlutils修改表格内容过程解析

一、xlutils是什么是一个提供了许多操作修改excel文件方法的库&#xff1b;属于python的第三方模块xlrd库用于读取excel文件中的数据&#xff0c;xlwt库用于将数据写入excel文件&#xff0c;修改用xlutils模块&#xff1b;xlutils库也仅仅是通过复制一个副本进行操作后保存一个…

html 显示不吃,20180902_html_第二次_张旺

Frequently Asked QuestionsIs it secure to send my companys information to COMIS?How can I enable SSL for my computer?1. Is it secure to send my companys information to COMIS?Your company information is protected by your unique user name and passwordwhic…

电脑键盘按钮功能注释大全

F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 CTRLA全选 CTRLC复制 CTRLX剪切 CTRLV粘贴 CTRLZ撤消 CTRLO打开 SHIFTDELETE永久删除 DELETE删除 ALTENTER属性 ALTF4关闭 CTRLF4关闭 ALTTAB切换 ALTESC切换 ALT空格键窗口菜单 CTRLESC开始菜单 拖动某一项时按CTRL复制所选…

ios开发 方形到圆的动画_iOS高级动画:圆形树展开收起动画

转自:标哥的技术博客&#xff0c;作者&#xff1a;黄仪标(微博)前段时间帮某某做了一个动画效果&#xff0c;今天分享给大家。关于动画的基础知识&#xff0c;这里不会细说&#xff0c;如果您还没有核心动画的基础知识&#xff0c;请先阅读相关文章&#xff0c;了解核心动画如何…

计算机桌面游戏开发,桌面游戏菜单怎么做

如何在桌面上制作游戏菜单使用360保险柜&#xff0c;将所有游戏添加到其中&#xff0c;您需要在运行时打开360保险柜&#xff0c;并且可以 打开计算机时会自动检测到计算机。 这是最经济的方式。如何在计算机桌面上创建游戏菜单&#xff1f; _您在桌面上创建一个游戏文件夹&…

ubuntu下git更改默认编辑器

ubuntu下使用git提交代码时&#xff0c;git commit时默认的编辑器是nano&#xff0c;这个编辑器实在是太恶心了&#xff0c;用惯了vim&#xff0c;所以如果修改默认编辑器&#xff0c;可以这样解决&#xff1a; 编辑.git/config&#xff0c;在core这块&#xff0c;加入editor …

人工智能生态环境预测_2020年全球人工智能芯片发展趋势及市场规模预测

中商情报网讯&#xff1a;智能芯片是面向人工智能领域而专门设计的芯片&#xff0c;其架构和指令集针对人工智能领域中的各类算法和应用作了专门优化&#xff0c;可高效支持视觉、语音、自然语言处理和传统机器学习等智能处理任务。采用专门为人工智能领域设计的处理器支撑人工…

多态性——vptr和vtable

转自&#xff1a;http://www.sf.org.cn/Article/base/200805/21024.html 多态性 (polymorphism) 是面向对象编程的基本特征之一。而在 C 中&#xff0c;多态性通过虚函数 (virtual function) 来实现。我们来看一段简单的代码&#xff1a;  #include <iostream>  usin…

rfcv函数实现_JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)...

// 获取RFC返回的字段值11 JCoParameterList exportParam function.getExportParameterList();12 String exParamA exportParam.getString("field_A");13 String exParamB exportParam.getString("field_B");14 // 遍历RFC返回的表对象15 JCoTable tb …