㈠ java怎麼同步發送及非同步發送簡訊例子解析
發送簡訊的介面
根據自己的情況選擇服務商。
開發文檔
從開發文檔中我們可以看到. 可以直接使用http請求也可以使用WebService請求發送簡訊. 由於DEMO文件夾下的java和jsp文件夾中的代碼都是使用http請求發送簡訊. 所以這里就不再細說了, 我們使用WebService的方式演示發送簡訊.
生成客戶端代碼
從介面文檔中我們知道它的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包, 以及眾多的類. 接下來開始編寫我們自己的代碼.
定義介面
為了方便, 這里我們首先定義一個介面:
Sms.java
publicinterfaceSms{
/**
*向mobile發送簡訊,內容為message
*
*@parammobile手機號
*@parammessage簡訊內容
*@return成功返回-1,否則返回其他值
*/
intsendMessage(Stringmobile,Stringmessage);
}
這個介面很簡單, 只有一個方法. 這個方法用來發送簡訊.
同步發送簡訊
接下來我們首先實現一個同步發送簡訊的類:
IhuyiSmsImpl.java
{
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;
}
}
非同步發送簡訊
由於發送簡訊涉及到網路通信, 因此sendMessage方法可能會有一些延遲. 為了改善用戶體驗, 我們可以使用非同步發送簡訊的方法. 原理很簡單: 如果用戶請求發送簡訊, 我們不是直接調用IhuyiSmsImpl的sendMessage方法, 而是將請求保存起來(生產者), 然後告訴用戶: 簡訊發送成功. 之後有若干個消費者取出任務, 調用sendMessage方法發送簡訊.
這里, 我使用線程池完成上面的任務:
AsyncSmsImpl.java
{
publicSmssendSms;
=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){}
}
}
在第17行, 我們獲得遠程對象的一個代理對象. 之後就可以通過這個代理對象進行發送簡訊, 查詢賬戶余額等操作.
第18行, 使用該代理對象的submit方法提交了簡訊內容. 該方法的參數信息及返回值含義在介面文檔中有詳細的說明.
第19行我們獲得了結果的狀態碼. 根據文檔上的說明, 狀態碼為2說明提交成功. 簡單起見, 這里我們只關注提交成功的情況. 需要注意的是, 狀態碼為2隻是說明提交成功. 根據官網上的"3-5秒內響應、100%到達", 我們可以推測. 如果提交成功, 那麼基本上3-5秒內,簡訊就會發送成功, 根據用戶的網路情況, 可能稍有延遲用戶就可以收到簡訊.
使用這段代碼發送簡訊也很簡單, 直接new一個對象, 設置好賬號和密碼就可以發送簡訊了.
代碼很簡單, 直接將Sms介面的sendMessage(mobile, message)方法作為一個任務加到線程池的任務隊列中. 這樣等到有空閑線程時, 就會執行sendSms.sendMessage(mobile, message)發送簡訊. 這里我們假設只要保存到線程池就可以成功發送簡訊. 因為發送失敗的情況實際上很罕見.
㈡ 用在非同步任務中用HttpUrlConnection獲取json的時候 運行到.connect();就崩潰 求解決
android5.0以後主線程不允許獲取網路數據,防止卡頓
㈢ java 原生的httpclient 能支持非同步嗎
什麼版本的java
。。。。。。。。。。
~~~~~~~~~~~~~~
㈣ java springMVC中前端一個發出http請求,請求中有A、B兩個操作,B操作比較耗時。
如果A操作和B操作之間沒有必然的關系的話,可以對B操作另起一個線程去執行,但是如果兩個操作之間存在因果關系的話只能等待
㈤ 你的這個「JAVA多線程處理http請求」怎麼處理的我現在也遇到了,能可點思路或dome嗎
你的意思是得到很多txt文件後,多線程解析嗎?
可以實現,將txt文件編號。
多線程解析後得到想要的(部分數據)。
將(部分數據)根據編號進行組合得到最終數據。
(小難點:如果確認所有的線程都已經執行完畢,再進行數據的組合)
高級點的,在組合時發現某個編號的數據不存在,可以重新解析,如果解析不成功,可以返回錯誤數據,指明是哪個txt文件的哪兒有問題。
㈥ java多線程,調用http介面報錯,java.net.ConnectException: Connection refused: connect
能成功首先排除防火牆或埠開發問題;
其次確定你連接的埠是否有最大連接數限制(類似mysql有最大連接線程數);
還有就是對應服務的拒絕策略是啥,默認丟棄
㈦ java關於非同步請求http介面
非同步請求,那就是開啟一條線程來發個http請求
等這條線程得到數據後,再通知主線程
android上的話,就有一個非同步任務AnsyTask就是用來處理非同步任務了
㈧ 在java中是否可以通過javax.servlet.http.HttpServletRequest對象判斷請求是否是非同步請求啊
推薦你在非同步提交時,多提交一個參數isAJAX=true;
然後,在過濾器中判斷這個參數來決定過不過濾。
㈨ 如何使用java多線程處理http請求,求思路
1、先說長連接吧,如果TCP協議的話長連接可以通過心跳包來實現。 2、推送的話,這個可以弄一個定時器,來控制線程,推送發送完畢,線程stop()。
㈩ java httpclient 並發量大怎麼辦
java httpclient 並發量大解決辦法:
首先你要增加一個關於非同步IO需要的包:
1、async-http-client包,可以在這里下載:https://oss.sonatype.org/content/repositories/releases/com/ning/async-http-client/1.6.2/
2、log4j的包,這個不用我說了,都知道在哪裡
3、slf4j-spi 的包,目前用1.5以上的版本比較多。
4、slf4j-log4j 的包,可以看出,slf4j是在log4j基礎上包裝的。
OK,就這幾個了,弄好後再看看下面這段代碼,通過使用它,性能可以得到明顯改善:
[java] view plain
AsyncHttpClient client = new AsyncHttpClient();
try {
Future<Response> f = client.prepareGet("http://www.google.com.hk/").execute();
System.out.println(f.get().getResponseBody("Big5"));//谷歌的輸出編碼集為Big5,反向解析結果的時候使用
}catch(...) {....}
這段代碼是不是超級簡單,可以通過上面描述的三種方式:
1、直接調用
2、將GetMethod或PostMethod對象作為共享對象反復使用。
3、使用AsyncHttpClient
這三種方法,非別使用一次調用、循環多次調用、並發調用來測試性能,後面兩者的性能比第一種方法的性能要高很多。