本文介紹了根據(jù)錯(cuò)誤狀態(tài)代碼關(guān)閉反應(yīng)堆網(wǎng)絡(luò)連接的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
為了將數(shù)據(jù)發(fā)送到遠(yuǎn)程內(nèi)容交付網(wǎng)絡(luò),我通過Spring Webflow框架使用了Reator Netty。當(dāng)客戶端請(qǐng)求完成時(shí),默認(rèn)的反應(yīng)程序Netty行為是保持連接活動(dòng)并將其釋放回基礎(chǔ)連接池。
某些內(nèi)容交付網(wǎng)絡(luò)建議針對(duì)某些類型的狀態(tài)代碼(例如,500內(nèi)部服務(wù)器錯(cuò)誤)重新解析DNS。為此,我添加了一個(gè)自定義NettyDnsNameResolver和DnsCache,但我還需要關(guān)閉連接,否則它將被釋放回池,并且不會(huì)重新解析DNS。
如何在出現(xiàn)錯(cuò)誤狀態(tài)代碼時(shí)關(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)閉該連接。
這種方法感覺很笨拙。如果在錯(cuò)誤狀態(tài)碼之后釋放連接,并且觀察器正在關(guān)閉該連接,則新請(qǐng)求是否可以并行獲取相同的連接?框架是否在內(nèi)部?jī)?yōu)雅地處理事情,或者這是否是使上述方法無效的爭(zhēng)用條件?
提前感謝您的幫助!
推薦答案
最好使用doOnResponse或doAfterResponseSuccess,具體取決于哪個(gè)用例更合適。
不過,等待釋放應(yīng)該不是問題
如果在錯(cuò)誤狀態(tài)碼之后釋放連接,而觀察者正在關(guān)閉該連接,則新請(qǐng)求是否可以并行獲取相同的連接?框架是否在內(nèi)部?jī)?yōu)雅地處理事情,或者這是否是使上述方法無效的爭(zhēng)用條件?
連接池默認(rèn)運(yùn)行FIFO租賃策略,如果池中有空閑連接,則不會(huì)獲得相同的連接,如果將連接池切換為后進(jìn)先出租賃策略,則不會(huì)獲得相同的連接。獲取時(shí),會(huì)檢查每個(gè)連接是否處于活動(dòng)狀態(tài),并且只提供活動(dòng)的連接供使用。
更新:
您也可以嘗試下面的方法,只使用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ù)錯(cuò)誤狀態(tài)代碼關(guān)閉反應(yīng)堆網(wǎng)絡(luò)連接的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,






