【问题标题】:Can I get original message after response回复后可以收到原始消息吗
【发布时间】:2020-10-28 14:09:48
【问题描述】:

你能帮我做一下spring集成吗?

我有使用 http 向其他系统发送 post 请求的集成流程。

发送后能否得到原始消息,因为我想对成功和错误进行其他操作。

ErrorHandler 只有 HttpClientResponse,但是响应体是空的,我需要 originalMessage 来处理这种情况。

与成功响应相同的情况。我没有原始消息信息可以进行下一步操作。

@Configuration
public class IntegrationConfiguration {

    @Bean
    public IntegrationFlow incChannel(HeaderEnricher enrichHeaders,
                                      HttpRequestExecutingMessageHandler notifyOnArrival) {
        return IntegrationFlows
                .from("send_notify_to")
                .transform(enrichHeaders)
                .handle(notifyOnArrival)
                .channel("save_success_status_original")
                .get();
    }

    @Bean
    public HeaderEnricher enrichHeaders() {
        Map<String, ? extends HeaderValueMessageProcessor<?>> headersToAdd =
                Collections.singletonMap("Content-Type", new StaticHeaderValueMessageProcessor<>(APPLICATION_JSON_VALUE));
        HeaderEnricher enricher = new HeaderEnricher(headersToAdd);
        return enricher;
    }

    @Bean
    HttpRequestExecutingMessageHandler notifyOnArrival(@Value("${uri}") String uri,
                                                          MappingJackson2HttpMessageConverter messageConverter) {

        HttpRequestExecutingMessageHandler handler =
                new HttpRequestExecutingMessageHandler(uri + "/api/notify");
        handler.setHttpMethod(HttpMethod.POST);
        handler.setExpectReply(false);
        handler.setMessageConverters(Arrays.asList(messageConverter));
        return handler;
    }

}

【问题讨论】:

    标签: spring-integration spring-integration-http


    【解决方案1】:

    .handle(notifyOnArrival) 只是一个服务激活器,包含从请求到回复的所有状态。我们只需要确保我们真正提供这种状态。在消息的上下文中保持状态的最佳位置是将请求消息存储到标头中,然后在之后的回复中或从ErrorMessage 中恢复它。

    headersToAdd.put("originalMesasge", new ExpressionEvaluatingHeaderValueMessageProcessor("#root", Message.class));
    

    所以,您从请求消息中添加 originalMesasge,这个将由服务激活器逻辑复制到回复消息中。

    【讨论】:

    • 谢谢,是的,我明白了。但它开始只与回复 handler.setExpectReply(false);应该是真的
    • 您可能需要查看是否可以向端点添加表达式建议以进行 REST 调用:docs.spring.io/spring-integration/docs/current/reference/html/…
    • 我将 HttpRequestExecutingMessageHandler 更改为 HTTP builder 初始化,但它使用 expectedReply(false) 初始化,并且此方法受保护,我无法调用它。为什么会这样?
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2011-09-30
    • 2018-12-04
    相关资源
    最近更新 更多