我在想,在HandlerInterceptor內進行HTTP fire and forget web service呼叫的最佳方式是什么(也許有更合適的方式)。比方說,我正在處理請求,我想為每個產生HTTP 5XX的回應通知一些API(通過發送請求和請求的回應體)。當然,通知應該發生在某個作業執行緒中(以火災和遺忘的方式)。
對于 WebFluxes WebClient,這應該是比較容易的(使用 .subscribeOn(Schedulers.elastic()))。但如果WebClient不可用呢?
uj5u.com熱心網友回復:
例如,你可以在這個相關的SO問題中看到,如何追蹤請求和回應并不總是一個簡單的任務。
無論在哪里,為了執行您所描述的fire and forget行為,您可以將您的方法注釋為@Async。通過這樣做,Spring將異步地呼叫被注釋的方法。
例如,請考慮以下使用RestTemplate的示例:
@Component
public class ErrorNotificationClient {
private final RestTemplate restTemplate。
public ErrorNotificationClient(RestTemplate restTemplate){
this.restTemplate = restTemplate。
}
//使用HttpServletRequest和HttpServletResponse(如果有的話),。
// exceptions, what you consider appropriate and have the ability?
//獲得
@Async
public void notifyError(
HttpServletRequest請求。
HttpServletResponse回應
) {
//建立你的請求作為表單的url編碼,json,等。
final String url = " 。
final HttpHeaders headers = new HttpHeaders() 。
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED)。
//對請求和回應進行必要的序列化。
final MultiValueMap<String, String> map = new LinkedMultiValueMap<>()。
map.add("request", "...")。
map.add("response", "...") 。
final HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<> (map, headers)。
//呼叫遠程呼叫
final ErrorNotificationResult errorNotificationResult = restTemplate.postForObject(url, request, ErrorNotificationResult.class)。
//考慮跟蹤或記錄結果,例如。
}
}
為了啟用Spring的異步處理,你需要在主配置或特定配置中定義@EnableAsync注解:
import org.springframework.context.annotation.Configuration。
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync
public class AsyncConfiguration {
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313449.html
標籤:
