Spring Integration-将参数和流从WebFlux入站网关传递到WebFlux出站网关

时间:2018-09-07 21:54:09

标签: spring-integration

我正在尝试使用混合了@Bean定义的DSL样式流来设置Spring Integration流。在此示例中,我尝试将传入的REST请求(restCustomerGateway)调解为入站Webflux网关。我看到您可以使用.payloadExpression将内容从请求中拉出(在这种情况下,如果有更好或更安全的类型安全方法,则将插入id路径参数...)。

然后我将其流到webflex出站网关(restCustomerSource)中以进行下游调用,然后应将其作为响应返回到入站网关。请注意,最终之间将需要使用变压器来进行有效负载转换等。

一个简单的问题是,如何构造它以便可以访问“ id”(路径参数,当前在出站网关调用中硬编码为“ 1”)?我假设这是两者之间流动的消息有效负载的一部分,但是如何获得它的句柄?

@Bean
public WebFluxInboundEndpoint restCustomerGateway() {
    return WebFlux.inboundGateway("/rest/customers/{id}")
        .requestMapping(m -> m.produces(MediaType.APPLICATION_JSON_VALUE)).payloadExpression("#pathVariables.id")
        .get();
}

@Bean
public WebFluxRequestExecutingMessageHandler restCustomerSource() {
    return WebFlux.outboundGateway("http://localhost:8080/customers/1").httpMethod(HttpMethod.GET)
        .expectedResponseType(Customer.class)
        .get();
}

@Bean
public IntegrationFlow restCustomerFlow(CustomerProcessor customerProcessor) {
    return IntegrationFlows
        .from(restCustomerGateway())
        .handle(restCustomerSource())
        .handle(customerProcessor)
        .get();
}

1 个答案:

答案 0 :(得分:2)

有一个

/**
 * Specify a {@link Function} to evaluate in order to generate the Message payload.
 * @param payloadFunction The payload {@link Function}.
 * @param <P> the expected HTTP request body type.
 * @return the spec
 * @see HttpRequestHandlingEndpointSupport#setPayloadExpression(Expression)
 */
public <P> S payloadFunction(Function<HttpEntity<P>, ?> payloadFunction) {

WebFluxInboundEndpointSpec上,但是您没有访问评估上下文变量甚至原始ServerWebExchange的权限,该功能中只有RequestEntity可用。 / p>

由于您已将id路径变量存储在消息的有效负载中,以通过payloadExpression("#pathVariables.id")向下游推送,因此它确实可以在WebFlux.outboundGateway()中访问。

您现在已经在硬编码uri上了,但是您可以改用以下变体:

/**
 * Create an {@link WebFluxMessageHandlerSpec} builder for request-reply gateway
 * based on provided {@code Function} to evaluate target {@code uri} against request message.
 * @param uriFunction the {@code Function} to evaluate {@code uri} at runtime.
 * @param <P> the expected payload type.
 * @return the WebFluxMessageHandlerSpec instance
 */
public static <P> WebFluxMessageHandlerSpec outboundGateway(Function<Message<P>, ?> uriFunction) {

因此,您的配置将如下所示:

WebFlux.outboundGateway(m -> "http://localhost:8080/customers/" + m.getPayload())