关键字: 观察者模式 企业短信服务 多线程
一、背景
某公司现有短信平台处理程序已经成熟运行,发送短信是在数据库表中插入一条记录表示要发送的短信。接收短信也是在数据库表中,公司内部系统非常多,有OA、客户、物流揽收、质量考核。。。。部分系统已经有了短信接收处理的需求并实现,但基本上是每个应用程序均是独立开发一个WINDOWS应用程序,自动定时运行去检测数据库中是否有接收到的短信,并进行处理,这样的方式耗费了大量的系统资源和数据库服务器资源。而且随着短信处理的需求增加此类应用程序的维护量也变得不可控。
基于此需求完全有必要开发统一的短信处理服务,减少短信处理需求的开发量并节约系统资源,降低维护成本。
二、短信服务设计
短信服务为一个WINDOWS服务,通过注册实现各个短信频道的处理类来实现各个短信频道的自动处理。新增频道时只需开发一个实现短信接口的短信处理类,并注册即可。短信服务可以应用于所有公司应用程序短信自动处理需求。
结构如下:
设计说明:
Ø 短信服务为WINDOWS应用程序,实现加载具体短信处理类、系统日志及检索是否有新短信,并通知新短信到来的处理程序,检索新短信由SMSDP的GetReceiveSMS方法实现
Ø SMSDP为短信处理程序,直接连接短信数据库中tb_smsrecev表,检索是否有已经注册频道的新短信,有新短信时触发新短信处理事件 smsNewSMSEvent
Ø 短信处理事件判断频道并产生对应的频道的线程代理类并执行处理线程
Ø 具体短信处理模块执行具体频道的短信处理,并可以扩展频道
三、短信服务开发接口说明
短信处理由各个应用系统自行开发系统短信所涉及的频道的新短信,处理类需要实现INewMessageDeal接口,并注册在短信服务程序的配置文件RoutDataSMSService.exe.config中即可
1、配置文件范例
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Channels" type="System.Configuration.DictionarySectionHandler"/>
</configSections>
<Channels>
<add key="185" value="RoutData.Test.SMS185.NewMessageDeal185,RoutData.Test.SMS185" />
<add key="998" value="RoutData.Test.SMS185.NewMessageDeal998,RoutData.Test.SMS185" />
<!--<add key="998" value="RoutData.Rise.SqlDP" /> -->
</Channels>
<appSettings>
<add key="ConnectionString" value="Provider=MSDAORA.1;Data Source=tmh.itb.web;user id=tmhuser;password=tmhtdxt" />
<add key="ConnectionString998" value="server=10.194.129.225;user id=EpUser;password=123;database=Epoweroa1;max pool size=100" />
<add key="SMS998Help" value="回复短信格式说明:998#操作类别#内容编号#操作参数,操作类别1表示确认接收2表示交接9表示帮助,当操作类别为2时操作参数为交接人的登录帐户,其它操作类别不需要带操作参数。谢谢" />
<add key="MaxCount" value="10" />
<add key="TimerInterval" value="5000" />
</appSettings>
</configuration>
新增处理频道时在 Channels节中添加频道配置信息
Key :频道号
Value:类名称和程序集名称.
其它所需的配置信息添加到 appSetting 节中
并可以在应用程序中通过
System.Configuration.ConfigurationSettings.AppSettings[key]; 获取
2、INewMessageDeal 接口说明
public virtual void NewMessageDeal(SMSDP sms,long lngID,string sSrcNO,string sChannel,string sBody)
{
}
参数说明:
n Sms:SMSDP类的实例,通过此类实例实现短信的回复功能等
n lngID:对应的短信编号,long 型
n sSrcNo:发送短信者的移动电话号码,string 类型
n sChannel: 短信频道号,string 类型
n sBody: 短信内容,string 类型
四、源代码及范例
4.1 windows服务主程序
主要功能: 加载短信处理具体实现类及服务调度程序等
4.2 短信处理类
主要作用: 检测是否有新的短信息 ,有则调用对应的具体实现类进行短信处理
4.3 短信处理父类,起到接口作用
4.4 具体实现类范例
我们在思考和解决企业某个应用问题时尽量多思考些对将来留下些可重用的部件,尽量有利于扩展.
以上代码已经在企业中稳定运行几年,提供大家交流和学习