spring - 如果成功交付到队列,则 Spring Integration DSL 回复成功
问题描述
我正在尝试公开 HTTP 端点,该端点会将消息发送到 JMS 队列,如果传递成功,我想回复 Success,如果无法传递消息,则回复 FAILURE。
@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 出站网关调用,其余代码未执行。
如果消息传递失败,我会得到正确的响应。
解决方案
你有这个配置:
.handle(
Jms.outboundGateway(jmsConnectionFactory,)
.requestDestination(message -> message.getHeaders().get(DESTINATION_QUEUE))
)
- 一个
outboundGateway
。这意味着您发送一个请求并期望来自另一方的响应,但看起来您只是将一条 JMS 消息发送到一个队列中,而另一方的侦听器端没有人用那个response.queue
. 这就是正常 JMS 发布超时的原因。
您需要确保您的流程中的逻辑是正确的,并且在您的分布式解决方案中确实有效,您期望从服务器端得到一些回复。
否则,您需要考虑将逻辑更改Jms.outboundAdapter()
为真正的单向发送者。对于 HTTP 回复,您可以将 apublishSubscribeChannel()
用作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
推荐阅读
- python - 错误 sqlite3.OperationalError:靠近“=”:语法错误
- c - CS50 可读性项目中的错误,只有 1 个输入,其他所有输入都有效
- malloc - GNU malloc 大小类
- discord.py - Discord python bot创建:清除消息命令,显示删除了多少消息
- meteor - Meteor 查询在服务器上运行得非常好,但在客户端上却不行
- python - 如何将语句转换为蛇案例?
- azure - 写入 zip - Azure 函数内部
- python - Marshmallow Schema 和类继承
- javascript - 控制台没有出现在 Chrome 开发者工具的底部
- sql - SQL Server 存储过程查询多个表