java發送短信系列之同步、異步發送短信。本站提示廣大學習愛好者:(java發送短信系列之同步、異步發送短信)文章只能為提供參考,不一定能成為您想要的結果。以下是java發送短信系列之同步、異步發送短信正文
本篇本章是發送短信的第一部門, 說一下同步/異步發送短信的代碼, 今後幾篇我們略微完美一下功效, 添加發送頻率的限制和日發送次數的限制.
發送短信的辦法能夠很多, 我們的辦法是應用辦事商供給的辦事. 普通來講, 這些辦事都是和說話有關的, 這裡我們應用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次等.
願望年夜家愛好這篇文章。