[我正在尝试公开HTTP端点,如果传递成功,则该HTTP端点会将消息丢弃到我想通过成功回复的JMS队列中,如果无法传递消息,则失败。
@Bean
public IntegrationFlow systemTaskCall(MapToServiceTaskConfigTransformer mapTransformer, CachingConnectionFactory jmsConnectionFactory) {
return IntegrationFlows.from(
Http.inboundGateway("/spartaSystemTask")
.requestMapping(r -> r
.methods(HttpMethod.POST)
.consumes("application/json")
)
.requestPayloadType(Map.class)
.replyChannel(RESPONSE_CHANNEL)
.errorChannel("errorChannel")
)
.handle((payload, headers) -> mapTransformer.transform((Map<String, String>) payload))
.enrichHeaders(Collections.singletonMap(DESTINATION_QUEUE, "request.queue"))
.enrichHeaders(Collections.singletonMap(JMS_REPLY_TO, "response.queue"))
.transform(Transformers.toJson())
.handle(
Jms.outboundGateway(jmsConnectionFactory,)
.requestDestination(message -> message.getHeaders().get(DESTINATION_QUEUE))
)
.log(LoggingHandler.Level.ERROR)
.enrichHeaders(
c -> c.header(org.springframework.integration.http.HttpHeaders.STATUS_CODE, HttpStatus.CREATED)
)
.transform(source -> "SUCCESS")
.transform(Transformers.toJson())
.channel(RESPONSE_CHANNEL)
.get();
}
@Bean
public IntegrationFlow errorFlow(){
return IntegrationFlows.from("errorChannel")
.transform(source -> "error")
.transform(Transformers.toJson())
.channel(RESPONSE_CHANNEL)
.get();
}
当我调用此URL时,消息被丢弃,但HTTP调用超时。似乎在JMS Outbound网关调用后,其余代码未执行。
如果邮件传递失败,我将得到正确的答复。
您具有此配置:
.handle(
Jms.outboundGateway(jmsConnectionFactory,)
.requestDestination(message -> message.getHeaders().get(DESTINATION_QUEUE))
)
outboundGateway
。这意味着您发送了一个请求,并期望从另一端得到响应,但是看起来您仅将JMS消息发送到了队列中,而另一方的侦听器中没有人向您发送该response.queue
中的内容。这就是超时使您无法正常进行JMS发布的原因。您需要确保逻辑在您的流程中是正确的,并且在您希望从服务器端得到一些答复的分布式解决方案中确实是正确的。
否则,您需要考虑将逻辑更改为实际上是单向发送方的Jms.outboundAdapter()
。对于HTTP回复,您可以将publishSubscribeChannel()
与Jms.outboundAdapter()
用作第一个订阅者,并将其余流程作为第二个订阅者。这样,直到第一个用户正确完成其逻辑后,第二个用户才被调用。对于错误情况,您可以用Jms.outboundAdapter()
来包装ExpressionEvaluatingRequestHandlerAdvice
:https://docs.spring.io/spring-integration/docs/5.2.3.RELEASE/reference/html/messaging-endpoints.html#message-handler-advice-chain