发明内容
本发明要解决的技术问题是提供一种批量短信预处理方法,克服现有技术短信提交方式在大批量短信提交时提交速度慢、等待时间长、用户体验差、容易导致提交失败的缺陷。
本发明为解决上述技术问题所采用的技术方案为:
一种批量短信预处理方法,包括步骤:
A1、短信发送客户端对短信发送数据进行分组;
A2、短信发送客户端将分组后的所述短信发送数据进行压缩;
A3、短信发送客户端将压缩后的所述短信发送数据发送到缓存服务器;
A4、缓存服务器将所述短信发送数据解压缩;
A5、缓存服务器将解压缩后的所述短信发送数据存储到缓存目录中并建立相应的索引文件;
A6、缓存服务器将所述短信发送数据发送到短信代理商服务器。
所述的批量短信预处理方法,其中所述步骤A1包括步骤:短信发送客户端在对所述短信发送数据进行分组之前先进行手机号码合法性检查。
所述的批量短信预处理方法,其中所述步骤A1包括步骤:短信发送客户端对短信内容中是否包含非法词语进行检查。
所述的批量短信预处理方法,其中所述步骤A1包括步骤:短信发送客户端进行短信黑名单检查。
所述的批量短信预处理方法,其中所述步骤A2包括步骤:短信发送客户端调用Zlip库中的TCompressionStream类对所述短信发送数据进行压缩。
所述的批量短信预处理方法,其中所述步骤A3包括步骤:短信发送客户端将所述短信发送数据通过WebService服务发送到缓存服务器。
所述的批量短信预处理方法,其中所述步骤A5包括步骤:缓存服务器在数据库中建立所述索引文件。
所述的批量短信预处理方法,其中所述步骤A5包括步骤:在缓存服务器上设置缓存处理程序,所述缓存处理程序用于查找和发送所述短信发送数据,所述缓存处理程序采用多线程工作方式。
所述的批量短信预处理方法,其中所述步骤A5包括步骤:在缓存服务器上设置监控程序来对所述缓存处理程序进行监控。
本发明的有益效果:本发明批量短信预处理方法使短信发送客户端提交短信时间大大缩短(如20万条短信提交只需不到2秒),极大的提高了提交效率,即使在网络状态不好的情况下也能持续地完成短信提交任务,保证了短信提交的实时性和稳定性。
具体实施方式
下面根据附图和实施例对本发明作进一步详细说明:
如图1所示,短信发送客户端对短信发送数据进行分组和压缩;然后分批通过WebSevice服务将短信发送数据发送到缓存服务器;缓存服务器将短信发送数据解压缩,存储到缓存目录中并建立相应的索引文件,再启动缓存处理程序将短信发送数据发送到短信代理商服务器。
如图2和图3所示,短信发送客户端首先对短信发送数据进行合法性检查,检查完毕后,对短信内容进行分页,然后对短信号码进行分组,对不同页的短信内容分别获取短信分组号码,获取后组成发送的xml格式数据,压缩后发送给缓存服务器。缓存服务器对xml格式数据进行解压缩处理,启动多个缓存处理程序,获取相关的短信发送数据后,将短信发送数据发送到短信代理商服务器。
对于如下的短信发送数据:短信号码:200000个,短信内容:130字通过具体实施例说明其提交过程。
短信发送客户端
1、短信发送数据合法性检查。
a.检测发送的手机号码是否符合标准
移动:134,135,136,137,138,139,150,151,152,157,158,159,187,188
联通:130,131,132,155,156,185,186
电信:133,153,180,189
检测手机号码是否是11位的数字,并且数字的前3位是否在以上的号段中。号码检测正则表达式如下:\b((%s)\d{8})+\b|{11,}。
b.短信非法词语检测
将短信的内容存入到内存字符串smscon中,然后通过在短信发送客户端本地保存的非法词语数据库Seriousword.db中的数据表t_smsseriousword中检索,获取当前发送的短信内容是否有非法词语,具体的查询语句为:
select distinct word from t_smsseriousword where POSITION(word in′″+smscon+′″)>0″
返回的数据字段word不为空,表示有非法词语。
返回的word字段为空,则表示短信内容正常。
c.黑名单检测
将短信的号码保存到内存字符串smsno中,然后通过短信发送客户端本地保存的非法词语库BlackNo.db中的数据表t_BlackPhone中进行检索,获取当前发送的号码中是否有黑名单号码,具体的查询语句为:
select distinct Number from t_BlackPhonewhere POSITION(Number in′″+smsno+′″)>0″
返回的数据字段Number不为空,表示发送号码中含有黑名单号码。返回的Number字段为空,则表示发送的短信号码正常。
2、短信发送数据分组、压缩和发送
2-1:获取用户发送的号码个数
将用户录入的短信号码读取到内存列表NumberList中。通过访问NumberList.Count的属性来获取当前用户输入的短信号码个数。
NumberList.Count=200000;
按照分组最大个数10W/组
通过TIniFile类来读取本地的配置文件IMConfig.db
最大分组=TIinFile.ReadString(‘MaxGrp’,‘Sect’,‘100000’)分组数=Ceil(NumberList.Count/100000)(此处不足一页按照一页进行计算,计算结果:分组数=2组)
2-2:获取短信发送内容的页数
根据短信代理商提供的每条短信最多可容纳的字数来进行短信内容分页。此处示例为70字/页(具体数据从供应商处获得),先将短信内容通过Length函数来获取当前短信字数的个数,如:Length(短信内容)=130,然后用Ceil函数来进行分页数的计算:
页数=Ceil(Length(短信内容)/70),不足一页按照一页进行计算,将分页后的短信内容依次存入到内存列表ContentList中
2-3:读取短信发送数据
内存列表下标从0开始,0表示第一组,循环读取短信分页内容,短信内容此处分为两页。
ContentList中存储的短信内容:
第一页内容=ContentList[0];(对应短信内容的1-70字),
第二页内容=ContentList[1](对应短信内容的71-130字),
NumberList中存储的号码内容:
第一组号码=NumberList[0](对应号码为1-100000之间的号码),
第二组号码=NumberList[1](对应号码为100001-200000之间的号码),
2-4:组合短信发送数据
循环读取短信内容,并根据每次读取的短信内容,再依次去获取对应的发送号码后,再组合成需要发送的xml数据串。
对于以上的数据,此处组合为:
第一组:ContentList[0]+NumberList[0]
第二组:ContentList[0]+NumberList[1]
第三组:ContentList[1]+NumberList[0]
第四组:ContentList[1]+NumberList[1]
将以上的几组数据依次按照xml格式进行组合,然后将数据读取到内存流中(TMemoryStream),调用Zlip库中的TCompressionStream类来对数据进行压缩,最后通过WebService服务提供的接口DoAction(constActionCode:Integer;const ActionXML:WideString)(ActionCode=100)将短信发送数据发送给缓存服务器。
缓存服务器
1、数据接收处理
接收到短信发送客户端的短信发送数据后,缓存服务器对xml格式数据进行解压缩处理,通过Zlib库中的TDeCompressionStream类对短信发送数据进行解压缩,解压出的xml描述文件和目标号码,存储到文件系统中的缓存目录下,同时在数据库中的索引文件中添加一条此发送包的索引,如MsgID、PID、AccessCode、发送总数、文件路径、提交时间等信息,索引信息存储到数据库系统中可以方便对数据检索操作,同时避免文件系统检索效率低的弊病。
2、缓存处理程序
短信发送数据存储完毕后,缓存服务器启动多个缓存处理程序,缓存处理程序对数据库中的索引文件进行读取,读取到相关的索引信息后根据索引信息在本地查找号码文件。获取到相关的短信发送数据后,将短信发送数据发送到短信代理商服务器。另外缓存处理程序采用多线程处理,避免在数据量过多时造成短信发送延迟。多个缓存处理程序在不停的运作过程中,可能会出现一些异常,此时若进行人工查看并处理会导致处理不及时。因此设置监控程序来对缓存处理程序进行监控,当发现某个缓存处理程序工作出现异常时可以对其进行重启,实时保证缓存处理程序处于正常运作状态。如果监控程序出现异常,会自动通过Email发送日志信息到系统管理员处,系统管理员可马上对其进行处理。
本领域技术人员不脱离本发明的实质和精神,可以有多种变形方案实现本发明,以上所述仅为本发明较佳可行的实施例而已,并非因此局限本发明的权利范围,凡运用本发明说明书及附图内容所作的等效结构变化,均包含于本发明的权利范围之内。