最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java發(fā)送短信系列之同步、異步發(fā)送短信

 更新時間:2016年02月21日 10:16:51   作者:BK  
這篇文章主要介紹了java發(fā)送短信系列之同步、異步發(fā)送短信的相關(guān)資料,感興趣的小伙伴們可以參考一下

本篇本章是發(fā)送短信的第一部分, 說一下同步/異步發(fā)送短信的代碼, 以后幾篇我們稍微完善一下功能, 添加發(fā)送頻率的限制和日發(fā)送次數(shù)的限制.

發(fā)送短信的方法可能不少, 我們的方法是使用服務(wù)商提供的服務(wù). 一般來說, 這些服務(wù)都是和語言無關(guān)的, 這里我們使用java寫示例程序.
1、發(fā)送短信的接口
根據(jù)自己的情況選擇服務(wù)商。
2、開發(fā)文檔
從開發(fā)文檔中我們可以看到. 可以直接使用http請求也可以使用WebService請求發(fā)送短信. 由于DEMO文件夾下的java和jsp文件夾中的代碼都是使用http請求發(fā)送短信. 所以這里就不再細(xì)說了, 我們使用WebService的方式演示發(fā)送短信.
3、生成客戶端代碼

從接口文檔中我們知道它的WebService的WSDL的url為: http://106.ihuyi.cn/webservice/sms.php?WSDL 那么我們可以執(zhí)行下面的命令生成客戶端代碼:

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

其中wsimport是JDK自帶的工具, -keep url選項是"保留生成的文件". 該命令會在當(dāng)前目錄下生成sms.cn.ihuyi._106包, 以及眾多的類. 接下來開始編寫我們自己的代碼.

4、定義接口

為了方便, 這里我們首先定義一個接口:

Sms.java

public interface Sms {
 /**
  * 向mobile發(fā)送短信, 內(nèi)容為message
  * 
  * @param mobile 手機號
  * @param message 短信內(nèi)容
  * @return 成功返回-1, 否則返回其他值
  */
 int sendMessage(String mobile, String message);
}

這個接口很簡單, 只有一個方法. 這個方法用來發(fā)送短信.

5、同步發(fā)送短信

接下來我們首先實現(xiàn)一個同步發(fā)送短信的類:

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("發(fā)送短信失敗, code:" + code);
  return code;
 }
}

在第17行, 我們獲得遠(yuǎn)程對象的一個代理對象. 之后就可以通過這個代理對象進(jìn)行發(fā)送短信, 查詢賬戶余額等操作.

第18行, 使用該代理對象的submit方法提交了短信內(nèi)容. 該方法的參數(shù)信息及返回值含義在接口文檔中有詳細(xì)的說明.

第19行我們獲得了結(jié)果的狀態(tài)碼. 根據(jù)文檔上的說明, 狀態(tài)碼為2說明提交成功. 簡單起見, 這里我們只關(guān)注提交成功的情況. 需要注意的是, 狀態(tài)碼為2只是說明提交成功. 根據(jù)官網(wǎng)上的"3-5秒內(nèi)響應(yīng)、100%到達(dá)", 我們可以推測. 如果提交成功, 那么基本上3-5秒內(nèi),短信就會發(fā)送成功, 根據(jù)用戶的網(wǎng)絡(luò)情況, 可能稍有延遲用戶就可以收到短信.

使用這段代碼發(fā)送短信也很簡單, 直接new一個對象, 設(shè)置好賬號和密碼就可以發(fā)送短信了.

6、異步發(fā)送短信

由于發(fā)送短信涉及到網(wǎng)絡(luò)通信, 因此sendMessage方法可能會有一些延遲. 為了改善用戶體驗, 我們可以使用異步發(fā)送短信的方法. 原理很簡單: 如果用戶請求發(fā)送短信, 我們不是直接調(diào)用IhuyiSmsImpl的sendMessage方法, 而是將請求保存起來(生產(chǎn)者), 然后告訴用戶: 短信發(fā)送成功. 之后有若干個消費者取出任務(wù), 調(diào)用sendMessage方法發(fā)送短信.

這里, 我使用線程池完成上面的任務(wù):

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("提交任務(wù)時發(fā)生錯誤" + e);
   return 0;
  }
  return -1;
 }

 public void destroy(){
  try{
   executorService.shutdown();
  }
  catch(Exception e){}
 }
}

代碼很簡單, 直接將Sms接口的sendMessage(mobile, message)方法作為一個任務(wù)加到線程池的任務(wù)隊列中. 這樣等到有空閑線程時, 就會執(zhí)行sendSms.sendMessage(mobile, message)發(fā)送短信. 這里我們假設(shè)只要保存到線程池就可以成功發(fā)送短信. 因為發(fā)送失敗的情況實際上很罕見.

到這里同步/異步發(fā)送短信就算是完成了,  接下來的幾篇我們看看一些常見的限制的實現(xiàn), 比如: 一分鐘只能發(fā)1次, 一天只能發(fā)送5次等.
希望大家喜歡這篇文章。

相關(guān)文章

  • SpringBoot配置 Druid 三種方式(包括純配置文件配置)

    SpringBoot配置 Druid 三種方式(包括純配置文件配置)

    本文給大家分享在項目中用純 YML(application.yml 或者 application.properties)文件、Java 代碼配置 Bean 和注解三種方式配置 Alibaba Druid 用于監(jiān)控或者查看 SQL 狀況的相關(guān)知識,感興趣的朋友一起看看吧
    2021-10-10
  • 解決Springboot配置excludePathPatterns不生效的問題

    解決Springboot配置excludePathPatterns不生效的問題

    這篇文章主要介紹了解決Springboot配置excludePathPatterns不生效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 詳解Http協(xié)議以及post與get區(qū)別

    詳解Http協(xié)議以及post與get區(qū)別

    這篇文章主要介紹了詳解Http協(xié)議以及post與get區(qū)別,通過分別說明Http協(xié)議以及get與post各自的概念,再到兩者作比較有著詳細(xì)的說明,希望對你有所幫助
    2021-06-06
  • 使用Maven中的scope總結(jié)

    使用Maven中的scope總結(jié)

    這篇文章主要介紹了使用Maven中的scope總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • springmvc fastjson 反序列化時間格式化方法(推薦)

    springmvc fastjson 反序列化時間格式化方法(推薦)

    下面小編就為大家?guī)硪黄猻pringmvc fastjson 反序列化時間格式化方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java多條件判斷場景中規(guī)則執(zhí)行器的設(shè)計

    Java多條件判斷場景中規(guī)則執(zhí)行器的設(shè)計

    近日在公司領(lǐng)到一個小需求,需要對之前已有的試用用戶申請規(guī)則進(jìn)行拓展。本文去掉if 判斷,試試用一個規(guī)則執(zhí)行器來替代它,感興趣的可以了解一下
    2021-06-06
  • java調(diào)用遠(yuǎn)程服務(wù)器的shell腳本以及停止的方法實現(xiàn)

    java調(diào)用遠(yuǎn)程服務(wù)器的shell腳本以及停止的方法實現(xiàn)

    這篇文章主要介紹了java調(diào)遠(yuǎn)程服務(wù)器的shell腳本以及停止的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 流讀取導(dǎo)致StringBuilder.toString()亂碼的問題及解決

    流讀取導(dǎo)致StringBuilder.toString()亂碼的問題及解決

    這篇文章主要介紹了流讀取導(dǎo)致StringBuilder.toString()亂碼的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 在JPA中criteriabuilder使用or拼接多個like語句

    在JPA中criteriabuilder使用or拼接多個like語句

    這篇文章主要介紹了在JPA中criteriabuilder使用or拼接多個like語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java使用MySQL實現(xiàn)連接池代碼實例

    Java使用MySQL實現(xiàn)連接池代碼實例

    這篇文章主要介紹了Java使用MySQL實現(xiàn)連接池代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03

最新評論

嘉义县| 科尔| 苏州市| 扶余县| 原平市| 米林县| 钟山县| 菏泽市| 裕民县| 福州市| 宁夏| 石阡县| 禹州市| 基隆市| 北票市| 江津市| 泸西县| 凤城市| 海阳市| 绥宁县| 内江市| 南江县| 中西区| 屏东市| 杭锦旗| 高淳县| 松阳县| 五大连池市| 枣阳市| 赤壁市| 绍兴市| 道真| 石柱| 怀来县| 榕江县| 桐柏县| 新竹市| 漳州市| 五家渠市| 隆回县| 吉隆县|