
WebFlux Spring 集成模塊 () 允許以反應方式執行 HTTP 請求和處理入站 HTTP 請求。??spring-integration-webflux?
?
您需要將此依賴項包含在項目中:
【資料圖】
org.springframework.integration spring-integration-webflux 6.0.0
在非基于 Servlet 的服務器配置的情況下,必須包含依賴關系。??io.projectreactor.netty:reactor-netty?
?
WebFlux 支持由以下網關實現組成:和 。 該支持完全基于SpringWebFlux和Project Actor基礎。 有關詳細信息,請參閱 HTTP 支持,因為許多選項在反應式和常規HTTP組件之間共享。??WebFluxInboundEndpoint?
???WebFluxRequestExecutingMessageHandler?
?
Spring 集成提供了一個命名空間和相應的模式定義。 若要將其包含在配置中,請在應用程序上下文配置文件中添加以下命名空間聲明:??webflux?
?
...
從版本 5.0 開始,提供了 的實現。 這個組件類似于基于MVC的,它通過新提取的共享一些常用選項。 它用于Spring WebFlux反應式環境(而不是MVC)。 以下示例顯示了 WebFlux 端點的簡單實現:??WebFluxInboundEndpoint?
???WebHandler?
???HttpRequestHandlingEndpointSupport?
???BaseHttpInboundEndpoint?
?
@Beanpublic IntegrationFlow inboundChannelAdapterFlow() { return IntegrationFlow .from(WebFlux.inboundChannelAdapter("/reactivePost") .requestMapping(m -> m.methods(HttpMethod.POST)) .requestPayloadType(ResolvableType.forClassWithGenerics(Flux.class, String.class)) .statusCodeFunction(m -> HttpStatus.ACCEPTED)) .channel(c -> c.queue("storeChannel")) .get();}
配置類似于(示例前面提到的),不同之處在于我們用于將 WebFlux 基礎架構添加到我們的集成應用程序中。 此外,通過使用反應式 HTTP 服務器實現提供的基于按需的背壓功能對下游流執行操作。??HttpRequestHandlingEndpointSupport?
???@EnableWebFlux?
???WebFluxInboundEndpoint?
???sendAndReceive?
?
回復部分也是非阻塞的,并且基于內部 ,該部分平面映射到按需解決的回復。? |
您可以使用自定義、 甚至 . 后者提供了一種機制,可用于將回復作為任何響應式類型返回:Reactor 、RxJava 等。 這樣,我們就可以使用 Spring 集成組件實現服務器發送事件場景,如以下示例所示:??WebFluxInboundEndpoint?
???ServerCodecConfigurer?
???RequestedContentTypeResolver?
???ReactiveAdapterRegistry?
???Flux?
???Observable?
???Flowable?
?
@Beanpublic IntegrationFlow sseFlow() { return IntegrationFlow .from(WebFlux.inboundGateway("/sse") .requestMapping(m -> m.produces(MediaType.TEXT_EVENT_STREAM_VALUE))) .handle((p, h) -> Flux.just("foo", "bar", "baz")) .get();}
有關更多可能的配置選項,請參閱請求映射支持和跨源資源共享 (CORS) 支持。
當請求正文為空或返回 時,請求參數 () 用于處理目標消息的 。??payloadExpression?
???null?
???MultiValueMap
???payload?
?
從版本 5.2 開始,可以使用 . 與HTTP 支持中的 MVC 驗證不同,它用于在執行回退和函數之前驗證請求已轉換為的元素。 框架無法假設對象在構建最終有效負載后會有多復雜。 如果需要限制最終有效負載(或其元素)的驗證可見性,則應將驗證轉移到下游,而不是 WebFlux 端點。 更多信息請參閱Spring WebFlux文檔。 無效的有效負載被拒絕,并顯示包含所有驗證的(擴展名)。 在 Spring 框架參考手冊中查看有關驗證的更多信息。??WebFluxInboundEndpoint?
???Validator?
???Publisher?
???HttpMessageReader?
???payloadExpression?
???Publisher?
???Publisher?
???IntegrationWebExchangeBindException?
???WebExchangeBindException?
???Errors?
?
(從版本 5.0 開始)實現類似于 。 它使用來自Spring Framework WebFlux模塊。 要配置它,請定義類似于以下內容的 Bean:??WebFluxRequestExecutingMessageHandler?
???HttpRequestExecutingMessageHandler?
???WebClient?
?
@Beanpublic IntegrationFlow outboundReactive() { return f -> f .handle(WebFlux.>outboundGateway(m -> UriComponentsBuilder.fromUriString("http://localhost:8080/foo") .queryParams(m.getPayload()) .build() .toUri()) .httpMethod(HttpMethod.GET) .expectedResponseType(String.class));}
該操作返回 ,該 映射到 (通過使用幾個步驟)作為 的輸出。 與 as 一起,評估將推遲到進行下游訂閱。 否則,它被視為一種模式,并且響應將適于 a 以獲得來自 的異步回復。 輸出消息的目標有效負載取決于配置。 或標識響應正文元素轉換的目標類型。 如果設置為 ,則響應正文將轉換為 a,并為每個元素提供,并將其作為有效負載發送到下游。 之后,您可以使用拆分器以反應方式迭代它。??WebClient?
???exchange()?
???Mono
???Mono.map()?
???AbstractIntegrationMessageBuilder?
???WebFluxRequestExecutingMessageHandler?
???ReactiveChannel?
???outputChannel?
???Mono
???async?
???Mono?
???SettableListenableFuture?
???WebFluxRequestExecutingMessageHandler?
???WebFluxRequestExecutingMessageHandler?
???setExpectedResponseType(Class>)?
???setExpectedResponseTypeExpression(Expression)?
???replyPayloadToFlux?
???true?
???Flux?
???expectedResponseType?
???Flux?
???Flux?
?
此外,可以注入 a 而不是 and 屬性。 它可用于對正文和 HTTP 標頭轉換的低級訪問和更多控制。 Spring 集成作為一個標識函數來生成(下游)整體和任何其他可能的自定義邏輯。??BodyExtractor, ClientHttpResponse>?
???WebFluxRequestExecutingMessageHandler?
???expectedResponseType?
???replyPayloadToFlux?
???ClientHttpResponse?
???ClientHttpResponseBodyExtractor?
???ClientHttpResponse?
?
從版本 5.2 開始,支持 反應式 、 和類型作為請求消息有效負載。 在內部使用相應的 以填充到 . 當有效負載是反應式 時,已配置 或 可用于確定發布者元素類型的類型。 表達式必須解析為 ,該解析為目標或 。??WebFluxRequestExecutingMessageHandler?
???Publisher?
???Resource?
???MultiValueMap?
???BodyInserter?
???WebClient.RequestBodySpec?
???Publisher?
???publisherElementType?
???publisherElementTypeExpression?
???Class>?
???String?
???Class>?
???ParameterizedTypeReference?
?
從版本 5.5 開始,公開一個標志(默認情況下)以僅返回響應正文,或返回整體作為回復消息有效負載,與提供的 or 無關。 如果 中不存在主體,則忽略此標志并返回整體。??WebFluxRequestExecutingMessageHandler?
???extractResponseBody?
???true?
???ResponseEntity?
???expectedResponseType?
???replyPayloadToFlux?
???ResponseEntity?
???ResponseEntity?
?
有關更多可能的配置選項,請參閱HTTP 出站組件。
由于 WebFlux 組件完全基于 HTTP 協議,因此 HTTP 標頭映射沒有區別。 有關用于映射標頭的更多可能選項和組件,請參閱HTTP 標頭映射。
從版本 6.0 開始,可以將 配置為通過 評估請求屬性。 必須在 中計算此 SpEL 表達式。 然后將此類映射傳播到 HTTP 請求配置回調。 如果需要將鍵值對象形式的信息從請求傳遞,并且下游過濾器將訪問這些屬性以進行進一步處理,這將很有幫助。??WebFluxRequestExecutingMessageHandler?
???setAttributeVariablesExpression()?
???Map?
???WebClient.RequestBodySpec.attributes(Consumer
???Message?
?