本文介紹了根據(jù)錯誤狀態(tài)代碼關(guān)閉反應(yīng)堆網(wǎng)絡(luò)連接的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
為了將數(shù)據(jù)發(fā)送到遠程內(nèi)容交付網(wǎng)絡(luò),我通過Spring Webflow框架使用了Reator Netty。當客戶端請求完成時,默認的反應(yīng)程序Netty行為是保持連接活動并將其釋放回基礎(chǔ)連接池。
某些內(nèi)容交付網(wǎng)絡(luò)建議針對某些類型的狀態(tài)代碼(例如,500內(nèi)部服務(wù)器錯誤)重新解析DNS。為此,我添加了一個自定義NettyDnsNameResolver
和DnsCache
,但我還需要關(guān)閉連接,否則它將被釋放回池,并且不會重新解析DNS。
如何在出現(xiàn)錯誤狀態(tài)代碼時關(guān)閉連接?
到目前為止,我已經(jīng)想出了以下解決方法,將ConnectionObserver
添加到反應(yīng)器Netty的TcpClient
:
TcpClient tcpClient = TcpClient.create()
.observe((connection, newState) -> {
if (newState == State.RELEASED && connection instanceof HttpClientResponse) {
HttpResponseStatus status = ((HttpClientResponse) connection).status();
if (status.codeClass() != HttpStatusClass.SUCCESS) {
connection.dispose();
}
}
});
即,如果連接已釋放(即放回連接池中),并且釋放是由狀態(tài)代碼為UNSUCCESS的HTTP客戶端響應(yīng)引起的,則關(guān)閉該連接。
這種方法感覺很笨拙。如果在錯誤狀態(tài)碼之后釋放連接,并且觀察器正在關(guān)閉該連接,則新請求是否可以并行獲取相同的連接?框架是否在內(nèi)部優(yōu)雅地處理事情,或者這是否是使上述方法無效的爭用條件?
提前感謝您的幫助!
推薦答案
最好使用doOnResponse或doAfterResponseSuccess,具體取決于哪個用例更合適。
不過,等待釋放應(yīng)該不是問題
如果在錯誤狀態(tài)碼之后釋放連接,而觀察者正在關(guān)閉該連接,則新請求是否可以并行獲取相同的連接?框架是否在內(nèi)部優(yōu)雅地處理事情,或者這是否是使上述方法無效的爭用條件?
連接池默認運行FIFO租賃策略,如果池中有空閑連接,則不會獲得相同的連接,如果將連接池切換為后進先出租賃策略,則不會獲得相同的連接。獲取時,會檢查每個連接是否處于活動狀態(tài),并且只提供活動的連接供使用。
更新:
您也可以嘗試下面的方法,只使用WebClient API而不使用反應(yīng)器Netty API:
return this.webClient
.get()
.uri("/500")
.retrieve()
.onStatus(status -> status.equals(HttpStatus.INTERNAL_SERVER_ERROR), clientResponse -> {
clientResponse.bodyToFlux(DataBuffer.class)
.subscribe(new BaseSubscriber<DataBuffer>() {
@Override
protected void hookOnSubscribe(Subscription subscription) {
subscription.cancel();
}
});
return Mono.error(new IllegalStateException("..."));
})
.bodyToMono(String.class);
這篇關(guān)于根據(jù)錯誤狀態(tài)代碼關(guān)閉反應(yīng)堆網(wǎng)絡(luò)連接的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,