Spring中非同步呼叫的三種實現方式

2021-10-23 03:47:32 字數 2386 閱讀 2237

});//設定超時時間

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 ...