IntegrationFlow HttpRequestHandlingMessagingGateway 直接回复
IntegrationFlow HttpRequestHandlingMessagingGateway reply directly
我是 Spring 集成的新手,我正在尝试使用 HttpRequestExecutingMessageHandler 和 HttpRequestHandlingMessagingGateway。处理程序正在发送 POST 请求并期待回复。网关正在处理请求。它工作正常,但处理程序没有得到回复。我不知道如何设置我的流程,我可以直接回复并继续我的流程。
@Bean
public HttpRequestExecutingMessageHandler httpOutbound() {
HttpRequestExecutingMessageHandler handler = Http.outboundGateway(restUrl)
.httpMethod(HttpMethod.POST)
.messageConverters(new MappingJackson2HttpMessageConverter())
.mappedRequestHeaders("Content-Type")
.get();
handler.setExpectReply(true);
handler.setOutputChannel(httpResponseChannel());
return handler;
}
@Bean
public HttpRequestHandlingMessagingGateway httpRequestGateway() {
HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway(true);
RequestMapping mapping = new RequestMapping();
mapping.setMethods(HttpMethod.POST);
mapping.setPathPatterns(httpRequestHandlingPathPattern);
gateway.setRequestMapping(mapping);
gateway.setErrorChannel(errorChannel());
gateway.setReplyChannel(replyChannel());
gateway.setRequestChannel(requestChannel());
gateway.setRequestPayloadTypeClass(DocumentConverterInput.class);
return gateway;
}
@Bean
public IntegrationFlow documentConverterFlow() {
return IntegrationFlows
.from(requestChannel())
.publishSubscribeChannel(publishSubscribeSpec ->
publishSubscribeSpec.subscribe(flow -> flow
.enrichHeaders(headerEnricherSpec -> headerEnricherSpec.header("http_statusCode", HttpStatus.OK))
.channel(replyChannel())))
.enrichHeaders(headerEnricherSpec ->
headerEnricherSpec.headerExpression(Constants.DOCUMENT_CONVERTER_INPUT, "payload"))
.handle(Jms.outboundAdapter(jmsTemplate(connectionFactory)))
.get();
}
我的 HttpRequestExecutingMessageHandler 已成功发布请求。 HttpRequestHandlingMessagingGateway 正在成功使用它。起初我有一个错误 "No reply received within timeout",所以我添加了一个 publishSubscriberChannel。我不知道这是否是正确的方法,但我找不到工作示例来说明如何正确回复。
我上面的代码有效,但没有将回复发送回 HttpRequestExecutingMessageHandler!
我的目标是接收请求报文,直接回传200 OK。之后我想继续我的集成流程,做一些事情并将结果发送到队列。
有什么建议吗?
对于 200 OK
响应,您需要考虑配置 HttpRequestHandlingMessagingGateway
和 expectReply = false
。这样它将作为入站通道适配器工作,但事实上 HTTP 始终是请求-响应,它只会执行此操作 setStatusCodeIfNeeded(response, httpEntity);
并且您在客户端的 HttpRequestExecutingMessageHandler
将得到一个空的, 但 OK
响应。
不确定为什么您的 channel(replyChannel())
没有按预期工作。可能是您 return 将请求 palyoad
发送到最终成为 HTTP 响应的回复消息中,但不知何故它在那里失败了,可能是在转换期间...
更新
这是一个简单的 Spring 引导应用程序,演示了 回复和处理 场景:https://github.com/artembilan/sandbox/tree/master/http-reply-and-process
我是 Spring 集成的新手,我正在尝试使用 HttpRequestExecutingMessageHandler 和 HttpRequestHandlingMessagingGateway。处理程序正在发送 POST 请求并期待回复。网关正在处理请求。它工作正常,但处理程序没有得到回复。我不知道如何设置我的流程,我可以直接回复并继续我的流程。
@Bean
public HttpRequestExecutingMessageHandler httpOutbound() {
HttpRequestExecutingMessageHandler handler = Http.outboundGateway(restUrl)
.httpMethod(HttpMethod.POST)
.messageConverters(new MappingJackson2HttpMessageConverter())
.mappedRequestHeaders("Content-Type")
.get();
handler.setExpectReply(true);
handler.setOutputChannel(httpResponseChannel());
return handler;
}
@Bean
public HttpRequestHandlingMessagingGateway httpRequestGateway() {
HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway(true);
RequestMapping mapping = new RequestMapping();
mapping.setMethods(HttpMethod.POST);
mapping.setPathPatterns(httpRequestHandlingPathPattern);
gateway.setRequestMapping(mapping);
gateway.setErrorChannel(errorChannel());
gateway.setReplyChannel(replyChannel());
gateway.setRequestChannel(requestChannel());
gateway.setRequestPayloadTypeClass(DocumentConverterInput.class);
return gateway;
}
@Bean
public IntegrationFlow documentConverterFlow() {
return IntegrationFlows
.from(requestChannel())
.publishSubscribeChannel(publishSubscribeSpec ->
publishSubscribeSpec.subscribe(flow -> flow
.enrichHeaders(headerEnricherSpec -> headerEnricherSpec.header("http_statusCode", HttpStatus.OK))
.channel(replyChannel())))
.enrichHeaders(headerEnricherSpec ->
headerEnricherSpec.headerExpression(Constants.DOCUMENT_CONVERTER_INPUT, "payload"))
.handle(Jms.outboundAdapter(jmsTemplate(connectionFactory)))
.get();
}
我的 HttpRequestExecutingMessageHandler 已成功发布请求。 HttpRequestHandlingMessagingGateway 正在成功使用它。起初我有一个错误 "No reply received within timeout",所以我添加了一个 publishSubscriberChannel。我不知道这是否是正确的方法,但我找不到工作示例来说明如何正确回复。
我上面的代码有效,但没有将回复发送回 HttpRequestExecutingMessageHandler!
我的目标是接收请求报文,直接回传200 OK。之后我想继续我的集成流程,做一些事情并将结果发送到队列。
有什么建议吗?
对于 200 OK
响应,您需要考虑配置 HttpRequestHandlingMessagingGateway
和 expectReply = false
。这样它将作为入站通道适配器工作,但事实上 HTTP 始终是请求-响应,它只会执行此操作 setStatusCodeIfNeeded(response, httpEntity);
并且您在客户端的 HttpRequestExecutingMessageHandler
将得到一个空的, 但 OK
响应。
不确定为什么您的 channel(replyChannel())
没有按预期工作。可能是您 return 将请求 palyoad
发送到最终成为 HTTP 响应的回复消息中,但不知何故它在那里失败了,可能是在转换期间...
更新
这是一个简单的 Spring 引导应用程序,演示了 回复和处理 场景:https://github.com/artembilan/sandbox/tree/master/http-reply-and-process