導航:首頁 > 編程語言 > javahttp非同步

javahttp非同步

發布時間:2022-03-11 22:03:29

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
    publicinterfaceSms{
    /**
    *向mobile發送簡訊,內容為message
    *
    *@parammobile手機號
    *@parammessage簡訊內容
    *@return成功返回-1,否則返回其他值
    */
    intsendMessage(Stringmobile,Stringmessage);
    }

    這個介面很簡單, 只有一個方法. 這個方法用來發送簡訊.

  5. 同步發送簡訊

    接下來我們首先實現一個同步發送簡訊的類:


    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;
    }
    }
  6. 非同步發送簡訊

    由於發送簡訊涉及到網路通信, 因此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一個對象, 設置好賬號和密碼就可以發送簡訊了.

  7. 代碼很簡單, 直接將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
這三種方法,非別使用一次調用、循環多次調用、並發調用來測試性能,後面兩者的性能比第一種方法的性能要高很多。

閱讀全文

與javahttp非同步相關的資料

熱點內容
優信二手車解壓後過戶 瀏覽:62
Windows常用c編譯器 瀏覽:778
關於改善國家網路安全的行政命令 瀏覽:833
安卓如何下載網易荒野pc服 瀏覽:654
javainetaddress 瀏覽:104
蘋果4s固件下載完了怎麼解壓 瀏覽:1003
命令zpa 瀏覽:286
python編譯器小程序 瀏覽:945
在app上看視頻怎麼光線調暗 瀏覽:540
可以中文解壓的解壓軟體 瀏覽:593
安卓卸載組件應用怎麼安裝 瀏覽:913
使用面向對象編程的方式 瀏覽:339
程序員項目經理的年終總結範文 瀏覽:929
內衣的加密設計用來幹嘛的 瀏覽:433
淮安數據加密 瀏覽:292
魔高一丈指標源碼 瀏覽:982
松下php研究所 瀏覽:168
c回調java 瀏覽:401
夢幻端游長安地圖互通源碼 瀏覽:746
電腦本地文件如何上傳伺服器 瀏覽:313