首页 > 解决方案 > 如果成功交付到队列,则 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 出站网关调用,其余代码未执行。

如果消息传递失败,我会得到正确的响应。

标签: springspring-integrationspring-integration-dsl

解决方案


你有这个配置:

.handle(
                    Jms.outboundGateway(jmsConnectionFactory,)
                        .requestDestination(message -> message.getHeaders().get(DESTINATION_QUEUE))

            )
  • 一个outboundGateway。这意味着您发送一个请求并期望来自另一方的响应,但看起来您只是将一条 JMS 消息发送到一个队列中,而另一方的侦听器端没有人用那个response.queue. 这就是正常 JMS 发布超时的原因。

您需要确保您的流程中的逻辑是正确的,并且在您的分布式解决方案中确实有效,您期望从服务器端得到一些回复。

否则,您需要考虑将逻辑更改Jms.outboundAdapter()为真正的单向发送者。对于 HTTP 回复,您可以将 apublishSubscribeChannel()用作Jms.outboundAdapter()第一个订阅者,将流程的其余部分用作第二个订阅者。这样,在第一个订阅者正确完成其逻辑之前,不会调用第二个订阅者。对于错误情况,您可以使用以下内容进行包装Jms.outboundAdapter()ExpressionEvaluatingRequestHandlerAdvicehttps: //docs.spring.io/spring-integration/docs/5.2.3.RELEASE/reference/html/messaging-endpoints.html#message-handler-advice-chain


推荐阅读