当前位置: 移动技术网 > IT编程>开发语言>Java > java发送短信系列之同步、异步发送短信

java发送短信系列之同步、异步发送短信

2019年07月22日  | 移动技术网IT编程  | 我要评论
本篇本章是发送短信的第一部分, 说一下同步/异步发送短信的代码, 以后几篇我们稍微完善一下功能, 添加发送频率的限制和日发送次数的限制. 发送短信的方法可能不少, 我们的

本篇本章是发送短信的第一部分, 说一下同步/异步发送短信的代码, 以后几篇我们稍微完善一下功能, 添加发送频率的限制和日发送次数的限制.

发送短信的方法可能不少, 我们的方法是使用服务商提供的服务. 一般来说, 这些服务都是和语言无关的, 这里我们使用java写示例程序.
1、发送短信的接口
根据自己的情况选择服务商。
2、开发文档
从开发文档中我们可以看到. 可以直接使用http请求也可以使用webservice请求发送短信. 由于demo文件夹下的java和jsp文件夹中的代码都是使用http请求发送短信. 所以这里就不再细说了, 我们使用webservice的方式演示发送短信.
3、生成客户端代码

从接口文档中我们知道它的webservice的wsdl的url为: http://106.ihuyi.cn/webservice/sms.php?wsdl 那么我们可以执行下面的命令生成客户端代码:

wsimport -keep http://106.ihuyi.cn/webservice/sms.php?wsdl

其中wsimport是jdk自带的工具, -keep url选项是"保留生成的文件". 该命令会在当前目录下生成sms.cn.ihuyi._106包, 以及众多的类. 接下来开始编写我们自己的代码.

4、定义接口

为了方便, 这里我们首先定义一个接口:

sms.java

public interface sms {
 /**
  * 向mobile发送短信, 内容为message
  * 
  * @param mobile 手机号
  * @param message 短信内容
  * @return 成功返回-1, 否则返回其他值
  */
 int sendmessage(string mobile, string message);
}

这个接口很简单, 只有一个方法. 这个方法用来发送短信.

5、同步发送短信

接下来我们首先实现一个同步发送短信的类:

ihuyismsimpl.java

public class ihuyismsimpl implements sms {

 private string account;
 private string password;

 public void setaccount(string account) {
  this.account = account;
 }

 public void setpassword(string password) {
  this.password = password;
 }

 @override
 public int sendmessage(string mobile, string message) {
  cn.ihuyi._106.sms factory = new cn.ihuyi._106.sms();
  smssoap smssoap = factory.getsmssoap();
  submitresult submit = smssoap.submit(account, password, mobile, message);
  int code = submit.getcode();
  if(code == 2){
   return -1;
  }
  system.out.println("发送短信失败, code:" + code);
  return code;
 }
}

在第17行, 我们获得远程对象的一个代理对象. 之后就可以通过这个代理对象进行发送短信, 查询账户余额等操作.

第18行, 使用该代理对象的submit方法提交了短信内容. 该方法的参数信息及返回值含义在接口文档中有详细的说明.

第19行我们获得了结果的状态码. 根据文档上的说明, 状态码为2说明提交成功. 简单起见, 这里我们只关注提交成功的情况. 需要注意的是, 状态码为2只是说明提交成功. 根据官网上的"3-5秒内响应、100%到达", 我们可以推测. 如果提交成功, 那么基本上3-5秒内,短信就会发送成功, 根据用户的网络情况, 可能稍有延迟用户就可以收到短信.

使用这段代码发送短信也很简单, 直接new一个对象, 设置好账号和密码就可以发送短信了.

6、异步发送短信

由于发送短信涉及到网络通信, 因此sendmessage方法可能会有一些延迟. 为了改善用户体验, 我们可以使用异步发送短信的方法. 原理很简单: 如果用户请求发送短信, 我们不是直接调用ihuyismsimpl的sendmessage方法, 而是将请求保存起来(生产者), 然后告诉用户: 短信发送成功. 之后有若干个消费者取出任务, 调用sendmessage方法发送短信.

这里, 我使用线程池完成上面的任务:

asyncsmsimpl.java

public class asyncsmsimpl implements sms {
 public sms sendsms;
 private executorservice executorservice = executors.newfixedthreadpool(3);

 public void setsendsms(sms sendsms) {
  this.sendsms = sendsms;
 }

 @override
 public int sendmessage(string mobile, string message) {
  try {
   executorservice.submit(() -> sendsms.sendmessage(mobile, message));
  }
  catch(exception e) {
   sysemt.out.println("提交任务时发生错误" + e);
   return 0;
  }
  return -1;
 }

 public void destroy(){
  try{
   executorservice.shutdown();
  }
  catch(exception e){}
 }
}

代码很简单, 直接将sms接口的sendmessage(mobile, message)方法作为一个任务加到线程池的任务队列中. 这样等到有空闲线程时, 就会执行sendsms.sendmessage(mobile, message)发送短信. 这里我们假设只要保存到线程池就可以成功发送短信. 因为发送失败的情况实际上很罕见.

到这里同步/异步发送短信就算是完成了,  接下来的几篇我们看看一些常见的限制的实现, 比如: 一分钟只能发1次, 一天只能发送5次等.
希望大家喜欢这篇文章。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网