使用Java DSL的流的日志请求,响应和总时间

时间:2017-02-01 21:56:53

标签: spring-integration spring-dsl

我正在尝试构建一个以Http.inboundGateway开头的流程 - >有几件事情,比如将请求数据存储到数据库,Header Enrichment,发送到AMQP并返回流的状态(成功/失败)。

我有一些我正在努力的事情,但我无法弄明白。

1.。)记录请求和响应。

我已经设法记录了Http.inboundGateway收到的请求(见下文。不确定这是否是正确的方法,但它有效。请建议有更好的方法)。也就是说,我无法获取发送给客户端的响应消息,也不知道如何计算流的事务时间并将其记录到日志文件中。如果我有办法在每次交易后打印统计数据都会非常有用,例如“收到:5,成功:4,失败:1,平均交易时间:250毫秒..等等”

@Bean
public IntegrationFlow httpInboundGateway()
{
    return IntegrationFlows.from(Http.inboundGateway("/httplistner")
                .requestMapping(requestMapping -> requestMapping.methods(HttpMethod.POST))
                .mappedRequestHeaders("*"))
            .transform(new ObjectToStringTransformer())
            .wireTap(flow -> flow.handle(message -> logger.info(">> Received Request from Caller.\nHeaders : "+message.getHeaders() + "\nPay Load : "+message.getPayload())))
            .channel(httpRequestChannel())
            .get();
}

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

我希望能够将日志语句(For Debugging)添加到我的Integration DSL定义中,这样我就可以查看日志文件并了解发生了什么以及出了什么问题。截至目前,除了在流程中间添加“.wireTap”之外,我无法找到办法,如上面的定义所示。请建议是否有更好/更正的方法。

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

我无法弄清楚如何自定义Http.inboundGateway在流完成后发送回客户端的HTTP响应。我怎么能这样做,或者你能指出我可以阅读并理解如何操作的文档吗?我希望使用Spring DSL。

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

1 个答案:

答案 0 :(得分:2)

捕获输出的技巧是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"));
    }

}
在1.2中添加了

.log并在下方使用了窃听。

修改

如果您使用指定频道......

    @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();
    }

并启用指标,如the documentation中所述,您可以获得all kinds of stats from that channel which will include average elapsed time for the downstream flow