java发送短信系列之同步、异步发送短信
本篇本章是发送短信的第一部分,说一下同步/异步发送短信的代码,以后几篇我们稍微完善一下功能,添加发送频率的限制和日发送次数的限制.
发送短信的方法可能不少,我们的方法是使用服务商提供的服务.一般来说,这些服务都是和语言无关的,这里我们使用java写示例程序.
1、发送短信的接口
根据自己的情况选择服务商。
2、开发文档
从开发文档中我们可以看到.可以直接使用http请求也可以使用WebService请求发送短信.由于DEMO文件夹下的java和jsp文件夹中的代码都是使用http请求发送短信.所以这里就不再细说了,我们使用WebService的方式演示发送短信.
3、生成客户端代码
从接口文档中我们知道它的WebService的WSDL的url为:http://106.ihuyi.cn/webservice/sms.php?WSDL那么我们可以执行下面的命令生成客户端代码:
wsimport-keephttp://106.ihuyi.cn/webservice/sms.php?WSDL
其中wsimport是JDK自带的工具,-keepurl选项是"保留生成的文件".该命令会在当前目录下生成sms.cn.ihuyi._106包,以及众多的类.接下来开始编写我们自己的代码.
4、定义接口
为了方便,这里我们首先定义一个接口:
Sms.java
publicinterfaceSms{
/**
*向mobile发送短信,内容为message
*
*@parammobile手机号
*@parammessage短信内容
*@return成功返回-1,否则返回其他值
*/
intsendMessage(Stringmobile,Stringmessage);
}
这个接口很简单,只有一个方法.这个方法用来发送短信.
5、同步发送短信
接下来我们首先实现一个同步发送短信的类:
IhuyiSmsImpl.java
publicclassIhuyiSmsImplimplementsSms{
privateStringaccount;
privateStringpassword;
publicvoidsetAccount(Stringaccount){
this.account=account;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
@Override
publicintsendMessage(Stringmobile,Stringmessage){
cn.ihuyi._106.Smsfactory=newcn.ihuyi._106.Sms();
SmsSoapsmsSoap=factory.getSmsSoap();
SubmitResultsubmit=smsSoap.submit(account,password,mobile,message);
intcode=submit.getCode();
if(code==2){
return-1;
}
System.out.println("发送短信失败,code:"+code);
returncode;
}
}
在第17行,我们获得远程对象的一个代理对象.之后就可以通过这个代理对象进行发送短信,查询账户余额等操作.
第18行,使用该代理对象的submit方法提交了短信内容.该方法的参数信息及返回值含义在接口文档中有详细的说明.
第19行我们获得了结果的状态码.根据文档上的说明,状态码为2说明提交成功.简单起见,这里我们只关注提交成功的情况.需要注意的是,状态码为2只是说明提交成功.根据官网上的"3-5秒内响应、100%到达",我们可以推测.如果提交成功,那么基本上3-5秒内,短信就会发送成功,根据用户的网络情况,可能稍有延迟用户就可以收到短信.
使用这段代码发送短信也很简单,直接new一个对象,设置好账号和密码就可以发送短信了.
6、异步发送短信
由于发送短信涉及到网络通信,因此sendMessage方法可能会有一些延迟.为了改善用户体验,我们可以使用异步发送短信的方法.原理很简单:如果用户请求发送短信,我们不是直接调用IhuyiSmsImpl的sendMessage方法,而是将请求保存起来(生产者),然后告诉用户:短信发送成功.之后有若干个消费者取出任务,调用sendMessage方法发送短信.
这里,我使用线程池完成上面的任务:
AsyncSmsImpl.java
publicclassAsyncSmsImplimplementsSms{
publicSmssendSms;
privateExecutorServiceexecutorService=Executors.newFixedThreadPool(3);
publicvoidsetSendSms(SmssendSms){
this.sendSms=sendSms;
}
@Override
publicintsendMessage(Stringmobile,Stringmessage){
try{
executorService.submit(()->sendSms.sendMessage(mobile,message));
}
catch(Exceptione){
Sysemt.out.println("提交任务时发生错误"+e);
return0;
}
return-1;
}
publicvoiddestroy(){
try{
executorService.shutdown();
}
catch(Exceptione){}
}
}
代码很简单,直接将Sms接口的sendMessage(mobile,message)方法作为一个任务加到线程池的任务队列中.这样等到有空闲线程时,就会执行sendSms.sendMessage(mobile,message)发送短信.这里我们假设只要保存到线程池就可以成功发送短信.因为发送失败的情况实际上很罕见.
到这里同步/异步发送短信就算是完成了, 接下来的几篇我们看看一些常见的限制的实现,比如:一分钟只能发1次,一天只能发送5次等.
希望大家喜欢这篇文章。