});//設定超時時間
asynccontext.settimeout(20000);
asynccontext.start(new runnable() catch (exception e)
//非同步請求完成通知
//此時整個請求才完成
asynccontext.complete();
}});
//此時之類 request的執行緒連線已經釋放了
system.out.println("主線程:" + thread.currentthread().getname());
}@responsebody
public callablecallablereq () };}
@configuration
public class requestasyncpoolconfig extends webmvcconfigureradapter
@bean
public timeoutcallableprocessinginterceptor timeoutcallableprocessinginterceptor()
}@responsebody
public webasynctaskwebasyncreq () catch (exception e)
logger.info("副執行緒返回");
system.out.println("內部執行緒返回:" + thread.currentthread().getname());
return "success";
};webasynctaskwat = new webasynctask(3000l, result);
wat.ontimeout(new callable()
});return wat;
}@responsebody
public deferredresultdeferredresultreq ()
});result.oncompletion(new runnable()
});mythreadpooltaskexecutor.execute(new runnable()
});return result;
}
非同步請求的處理。除了非同步請求,一般上我們用的比較多的應該是非同步呼叫。通常在開發過程中,會遇到乙個方法是和實際業務無關的,沒有緊密性的。比如記錄日誌資訊等業務。這個時候正常就是啟乙個新執行緒去做一些業務處理,讓主線程非同步的執行其他業務。呼叫同乙個類下注有@async非同步方法:在spring中像@async和@transactional、cache等註解本質使用的是動態**,其實spring容器在初始化的時候spring容器會將含有aop註解的類物件「替換」為**物件(簡單這麼理解),那麼註解失效的原因就很明顯了,就是因為呼叫方法的是物件本身而不是**物件,因為沒有經過spring容器,那麼解決方法也會沿著這個思路來解決。
呼叫的是靜態(static )方法
呼叫(private)私有化方法
將要非同步執行的方法單獨抽取成乙個類,原理就是當你把執行非同步的方法單獨抽取成乙個類的時候,這個類肯定是被spring管理的,其他spring元件需要呼叫的時候肯定會注入進去,這時候實際上注入進去的就是**類了。
其實我們的注入物件都是從spring容器中給當前spring元件進行成員變數的賦值,由於某些類使用了aop註解,那麼實際上在spring容器中實際存在的是它的**物件。那麼我們就可以通過上下文獲取自己的**物件呼叫非同步方法。
@controller
public class
emailcontroller catch (exception e)
return resmap;
}//注意一定是public,且是非static方法
@async
public void testasynctask() throws interruptedexception
}
開啟cglib**,手動獲取spring**類,從而呼叫同類下的非同步方法。
參考:
dubbo非同步呼叫三種方式
非同步通訊對於服務端響應時間較長的方法是必須的,能夠有效地利用客戶端的資源,在dubbo中,消費端通過 async true 標識。具體有三種方式 1 nio future主動獲取結果,返回結果放在rpccontext中 需要注意的是,由於rpccontext是單例模式,所以每次呼叫完後,需要儲存乙...
SCA程式設計模式三種方式的非同步呼叫
我們知道,常見的方法呼叫都是同步呼叫,這種呼叫方式是一種阻塞式的呼叫方式,即客戶端 主呼叫方 一直阻塞等待直到被服務端 被呼叫方 返回 為止。這種呼叫方式相對比較直觀,也是大部分程式語言直接支援的一種呼叫方式。但是,如果我們面對是基於粗粒度的服務元件,面對的是一些需要比較長時間才 能有響應的應用場景...
關於webservice的非同步呼叫簡單例項
關於webservice的非同步呼叫簡單例項 無論在任何情況下,被呼叫方的 無論是被非同步呼叫還是同步呼叫的情況下,被呼叫方的 都是一樣的,下面,我們就以非同步呼叫乙個webservice 為例作說明。這是乙個webservice public function delcurtable byval ...