java發(fā)送短信系列之同步、異步發(fā)送短信
本篇本章是發(fā)送短信的第一部分, 說一下同步/異步發(fā)送短信的代碼, 以后幾篇我們稍微完善一下功能, 添加發(fā)送頻率的限制和日發(fā)送次數(shù)的限制.
發(fā)送短信的方法可能不少, 我們的方法是使用服務商提供的服務. 一般來說, 這些服務都是和語言無關(guān)的, 這里我們使用java寫示例程序.
1、發(fā)送短信的接口
根據(jù)自己的情況選擇服務商。
2、開發(fā)文檔
從開發(fā)文檔中我們可以看到. 可以直接使用http請求也可以使用WebService請求發(fā)送短信. 由于DEMO文件夾下的java和jsp文件夾中的代碼都是使用http請求發(fā)送短信. 所以這里就不再細說了, 我們使用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選項是"保留生成的文件". 該命令會在當前目錄下生成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行, 我們獲得遠程對象的一個代理對象. 之后就可以通過這個代理對象進行發(fā)送短信, 查詢賬戶余額等操作.
第18行, 使用該代理對象的submit方法提交了短信內(nèi)容. 該方法的參數(shù)信息及返回值含義在接口文檔中有詳細的說明.
第19行我們獲得了結(jié)果的狀態(tài)碼. 根據(jù)文檔上的說明, 狀態(tài)碼為2說明提交成功. 簡單起見, 這里我們只關(guān)注提交成功的情況. 需要注意的是, 狀態(tài)碼為2只是說明提交成功. 根據(jù)官網(wǎng)上的"3-5秒內(nèi)響應、100%到達", 我們可以推測. 如果提交成功, 那么基本上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ā)送成功. 之后有若干個消費者取出任務, 調(diào)用sendMessage方法發(fā)送短信.
這里, 我使用線程池完成上面的任務:
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("提交任務時發(fā)生錯誤" + e); return 0; } return -1; } public void destroy(){ try{ executorService.shutdown(); } catch(Exception e){} } }
代碼很簡單, 直接將Sms接口的sendMessage(mobile, message)方法作為一個任務加到線程池的任務隊列中. 這樣等到有空閑線程時, 就會執(zhí)行sendSms.sendMessage(mobile, message)發(fā)送短信. 這里我們假設(shè)只要保存到線程池就可以成功發(fā)送短信. 因為發(fā)送失敗的情況實際上很罕見.
到這里同步/異步發(fā)送短信就算是完成了, 接下來的幾篇我們看看一些常見的限制的實現(xiàn), 比如: 一分鐘只能發(fā)1次, 一天只能發(fā)送5次等.
希望大家喜歡這篇文章。
相關(guān)文章
Java?20在Windows11系統(tǒng)下的簡易安裝教程
這篇文章主要給大家介紹了關(guān)于Java?20在Windows11系統(tǒng)下的簡易安裝教程,學習Java的同學,第一步就是安裝好Java環(huán)境,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-07-07java ThreadPoolExecutor使用方法簡單介紹
這篇文章主要介紹了java ThreadPoolExecutor使用方法簡單介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02Spring boot項目中異常攔截設(shè)計和處理詳解
這篇文章主要介給大家紹了關(guān)于Spring boot項目中異常攔截設(shè)計和處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧2018-12-12java 字符串轉(zhuǎn)化為字符數(shù)組的3種實現(xiàn)案例
這篇文章主要介紹了java 字符串轉(zhuǎn)化為字符數(shù)組的3種實現(xiàn)案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10