Spring integration 使用JavaDSL记录请求、响应和流所花费的总时间

Spring integration 使用JavaDSL记录请求、响应和流所花费的总时间,spring-integration,spring-dsl,Spring Integration,Spring Dsl,我正在尝试构建一个以Http.inboundGateway->开始的流,该流执行多项操作,如将请求数据存储到数据库、执行头扩展、发送到AMQP并返回流状态(成功/失败) 我有一些事情我正在努力解决,但我还没有弄明白 1.)记录请求和响应。 我已经成功地记录了Http.inboundGateway收到的请求(见下文。不确定这是否是正确的方法,但它可以工作。请建议有更好的方法)。也就是说,我无法获得发送给客户机的响应消息,并且对于如何计算流的事务时间并将其记录到日志文件也有些不知所措。如果有一种方法

我正在尝试构建一个以Http.inboundGateway->开始的流,该流执行多项操作,如将请求数据存储到数据库、执行头扩展、发送到AMQP并返回流状态(成功/失败)

我有一些事情我正在努力解决,但我还没有弄明白

1.)记录请求和响应。

我已经成功地记录了Http.inboundGateway收到的请求(见下文。不确定这是否是正确的方法,但它可以工作。请建议有更好的方法)。也就是说,我无法获得发送给客户机的响应消息,并且对于如何计算流的事务时间并将其记录到日志文件也有些不知所措。如果有一种方法可以让我在每次交易后打印统计数据,比如“接收:5,成功:4,失败:1,平均交易时间:250ms..等等”,那将非常有用

2.)如何将日志语句添加到Spring DSL流?

我希望能够将日志语句(用于调试)添加到集成DSL定义中,以便查看日志文件并了解发生了什么以及出现了什么问题。到目前为止,除了在上面定义的流中添加“.WiTrAP”之外,我找不到其他方法。请建议是否有更好/正确的方法

3.)自定义“Http.inboundGateway”发送的响应。

我不知道如何自定义HTTP.inboundGateway在流完成后发送回客户端的HTTP响应。我该怎么做,或者你能给我指一下我可以阅读并理解如何做的文档吗?我希望使用Spring DSL


错误响应也是如此。如您所见,我没有向我的Http.inboundGateway添加错误通道。因此,如果当前配置中出现错误,客户端将获得500和完整堆栈跟踪。如何获取错误消息,并能够基于错误构建自定义响应并将其发送到客户端。示例:如果他们向我发送了XML有效负载,并且XML格式不正确,我希望能够向他们发送HTTP 400,在响应中包含一些详细信息,表明他们的请求数据格式不正确。

捕获输出的技巧是
log()
,然后是“无路桥”-命名,因为它没有输出通道-因此框架将结果发送回网关

给你

@SpringBootApplication
public class So41990546Application {

    public static void main(String[] args) {
        SpringApplication.run(So41990546Application.class, args);
    }

    @Bean
    public IntegrationFlow flow() {
        return IntegrationFlows.from(Http.inboundGateway("/foo")
                    .requestMapping(requestMapping -> requestMapping.methods(HttpMethod.POST))
                    .mappedRequestHeaders("*")
                    .requestPayloadType(String.class))
                .log(Level.INFO, m -> "Inbound: " + m.getPayload())
                .<String, String>transform(String::toUpperCase)
                .log(Level.INFO, m -> "Outbound: " + m.getPayload())
                .bridge(e -> e.id("Bridge.to.nowhere"))
                .get();
    }

    @Bean
    public IntegrationFlow errorsFlow() {
        return IntegrationFlows.from(Http.inboundGateway("/errors")
                    .requestMapping(requestMapping -> requestMapping.methods(HttpMethod.POST))
                    .mappedRequestHeaders("*")
                    .requestPayloadType(String.class)
                    .errorChannel("errors.input"))
                .log(Level.INFO, m -> "Inbound: " + m.getPayload())
                .transform("1 / 0")
                .log(Level.INFO, m -> "Outbound: " + m.getPayload())
                .bridge(e -> e.id("Another.bridge.to.nowhere"))
                .get();
    }

    @Bean
    public IntegrationFlow errors() {
        return f -> f.transform("'Error: ' + payload.cause.message")
                .enrichHeaders(b -> b.header(HttpHeaders.STATUS_CODE, 400))
                .log(Level.INFO) // log the whole message so we can see the status code
                .bridge(e -> e.id("Another.b.t.n"));
    }

}

并启用度量,如中所述。

我倾向于建议这里的所有成员,尤其是新用户,不要以“请帮我举个例子”的形式提出明确的请求。这是因为这听起来很像那些出现并希望有人为他们做所有工作的人。记住,我们这里有很多乞讨的人,所以如果你能努力让自己听起来不像那些人,那会对你有很大帮助。@halfer:很抱歉让你听起来很绝望。如果事情是那样的,我很抱歉。放心吧,我自己也尽了最大的努力想办法。不幸的是,我完全是Spring集成的新手,我无法将文档中的点连接起来(我至少读了2-3遍:-)。非常感谢Gary提供的详细示例。我会试一试,然后再报告。
@SpringBootApplication
public class So41990546Application {

    public static void main(String[] args) {
        SpringApplication.run(So41990546Application.class, args);
    }

    @Bean
    public IntegrationFlow flow() {
        return IntegrationFlows.from(Http.inboundGateway("/foo")
                    .requestMapping(requestMapping -> requestMapping.methods(HttpMethod.POST))
                    .mappedRequestHeaders("*")
                    .requestPayloadType(String.class))
                .log(Level.INFO, m -> "Inbound: " + m.getPayload())
                .<String, String>transform(String::toUpperCase)
                .log(Level.INFO, m -> "Outbound: " + m.getPayload())
                .bridge(e -> e.id("Bridge.to.nowhere"))
                .get();
    }

    @Bean
    public IntegrationFlow errorsFlow() {
        return IntegrationFlows.from(Http.inboundGateway("/errors")
                    .requestMapping(requestMapping -> requestMapping.methods(HttpMethod.POST))
                    .mappedRequestHeaders("*")
                    .requestPayloadType(String.class)
                    .errorChannel("errors.input"))
                .log(Level.INFO, m -> "Inbound: " + m.getPayload())
                .transform("1 / 0")
                .log(Level.INFO, m -> "Outbound: " + m.getPayload())
                .bridge(e -> e.id("Another.bridge.to.nowhere"))
                .get();
    }

    @Bean
    public IntegrationFlow errors() {
        return f -> f.transform("'Error: ' + payload.cause.message")
                .enrichHeaders(b -> b.header(HttpHeaders.STATUS_CODE, 400))
                .log(Level.INFO) // log the whole message so we can see the status code
                .bridge(e -> e.id("Another.b.t.n"));
    }

}
    @Bean
    public IntegrationFlow flow() {
        return IntegrationFlows.from(Http.inboundGateway("/foo")
                    .requestMapping(requestMapping -> requestMapping.methods(HttpMethod.POST))
                    .mappedRequestHeaders("*")
                    .requestPayloadType(String.class))
                .channel(namedChannel())
                .log(Level.INFO, m -> "Inbound: " + m.getPayload())
                .<String, String>transform(String::toUpperCase)
                .log(Level.INFO, m -> "Outbound: " + m.getPayload())
                .bridge(e -> e.id("Bridge.to.nowhere"))
                .get();
    }

    public MessageChannel namedChannel() {
        return new DirectChannel();
    }