業務開發中,有很多場景會有比較耗時的操作
比如需要呼叫第三方介面查詢資料、發郵件等
都有可能需要1秒以上的時間
如果按照傳統的方式處理,即是執行緒阻塞1秒以上的時間去等待結果,再把結果返回給使用者
而且處理請求的執行緒池中線程數總是有限的,如果執行緒都阻塞在等待中,後續的請求只能排隊等候
這也就影響到了伺服器的併發處理能力
為了讓請求的執行緒盡早的釋放出來,就需要使用非同步方式處理耗時的請求
簡單的思路就是當有耗時操作時,讓請求的執行緒先退出,把任務交給另乙個執行緒來處理,
這樣請求的執行緒就可以繼續處理後面的請求,提高了伺服器的併發處理能力
servlet api3.0就增加了非同步處理方法,考慮到使用寫底層servlet的機會比較少,主流的開發還是基於springboot 或springmvc
本文主要解釋一下springboot的非同步處理方法
方法一:webasynctask
建立乙個callable物件,並由新執行緒去執行耗時任務,並由新執行緒返回response給使用者
@restcontroller
public class greetingcontroller catch (interruptedexception e)
return null;}};
system.out.println("請求處理執行緒方法執行完畢時間 : "+system.currenttimemillis()+"秒");
return new webasynctask(callable);
}}
方法二:defferedresult
建立乙個defferedresult 物件,把這個物件寄存起來,可以建立乙個新執行緒來處理耗時任務,也可以交給其它執行緒處理,比如下面的**,就是交給乙個定時任務來處理,你也可以把這個物件交給佇列的訂閱事件來處理,這樣就是乙個完全不阻塞的流程了。
@restcontroller
public class testdelay
/*** 定時任務
*/@scheduled(fixeddelay = 5000)
public void taskresp() catch (exception e)
});} }
}
由上面兩個例子可以看出:
webasynctask 可以釋放請求的主線程,但還是要另乙個執行緒來阻塞處理
defferedresult 則可以用非阻塞的方法來處理請求
所以在實際場景中,會更多的使用到defferedresult
springboot整合dubbo實現非同步呼叫
二 在consumer端實現 三 結果 與正常dobbu使用一樣,只是設定service屬性async ture service version 1.0 group hehe async true public class userserviceimpl implements userservice...
springboot使用 async實現非同步執行緒池
工作中經常涉及非同步任務,通常是使用多執行緒技術,比如執行緒池threadpoolexecutor,但使用executors容易產生oom,需要手動使用threadpoolexecutor建立執行緒池 在springboot使用 async 可以實現非同步呼叫,配置執行緒池引數,可以簡單的實現多執行...
spring boot 效能監控
廢話不多說,直接上乾貨 spring boot自帶效能監控,需要引入依賴包如下 org.springframework.boot spring boot starter actuator 繼承abstractendpoint類,實現invoke方法,返回需要展示的效能資訊。建構函式必須傳入乙個指定的...