一旦http调用花费的时间超过Spring集成dsl所需的时间,如何发送错误消息



这里有三个子流,其中一个子流是HTTP出站调用。我希望HTTP调用应该在提到的时间之前尝试获得响应。如果超时,那么主流应该中断,并且应该以Json格式显示错误消息作为输出。

以下是代码-

     @Bean
      public IntegrationFlow flow() {
        return flow ->
            flow.handle(validatorService, "validateRequest")
                .split()
                .channel(c -> c.executor(Executors.newCachedThreadPool()))
                .scatterGather(
                    scatterer ->
                        scatterer
                            .applySequence(true)
                            .recipientFlow(flow1())
                            .recipientFlow(
                                f ->
                                    f.gateway(
                                        flow2(), gateway -> gateway.replyTimeout(3000L).errorChannel("errorChannel")))
                            .recipientFlow(flow3()),
                    gatherer ->
                        gatherer
                            .releaseLockBeforeSend(true)
                            .releaseStrategy(group -> group.size() == 2))
                .aggregate(someMethod1())
                .to(someMethod2());
      }
  private IntegrationFlow returnError() {
    return IntegrationFlows.from("errorChannel").handle(System.out::println).get();
  }

我已经添加了errorChannel,但如何向用户发送自定义消息?

有关消息网关中的错误处理,请参阅文档:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-没有回应。

考虑在网关定义中添加errorChannel()replyTimeout(),以构建您想要的错误回复。但是,您也可以考虑为用于该HTTP调用的RestTemplate添加请求超时,以防止等待HTTP响应的时间过长。

更新

首先,您需要了解请求-回复是一种"等待"的方法。我们发送一个请求,如果使用该消息的进程正在阻塞——在生成该消息的线程中立即执行,那么我们不会到达"阻塞";等待";直到这个过程结束。在大多数情况下(默认情况下(使用DirectChannel,因此它被阻止,因为它是在调用线程中执行的。这个过程可能是您的HTTP调用,也是请求-响应模式。所以,我们没有达到";等待";部分,直到此HTTP调用返回,或超时,或因错误而失败。只有在那之后,replyTimeout才会生效,等待来自底层进程的回复。如果该过程的输入通道不是直接的,则这可能会发生变化。请参见ExecutorChannelQueueChannel。这样,发送部分立即退出,因为没有任何东西可以阻止它;等待";部分观察CCD_ 8。

因此,您需要重新考虑replyTimeout()选项是否适合您。也许上面提到的RestTemplaterequestTimeout对您来说是更好的选择,而不是将流重新设计为异步解决方案来利用replyTimeout()功能。再次:请参阅我提到的关于replyTimeout功能的文档。

错误处理如下所述:https://docs.spring.io/spring-integration/docs/current/reference/html/error-handling.html#error-处理。

确实不建议依赖全局errorChannelbean。在没有配置显式错误通道的异步进程中,这种方法随处可见。

你在你的问题中说";向用户发送定制消息";,但您的错误处理流程是单向的-System.out::println。如果您想从错误处理流中返回任何内容,端点必须回复一个,例如:

.handle((p, h) -> "The error during HTTP call: " + p)

另请查看您是否正确声明了returnError()。它真的不可能只是简单的private方法。IntegrationFlow必须以这种或其他方式声明为bean,以启动端点和通道的连接过程。现在,它只是一个普通的、未使用的private方法。该框架认为该方法没有任何作用。请参阅文档中的Java DSL基础知识:https://docs.spring.io/spring-integration/docs/current/reference/html/dsl.html#java-dsl

相关内容

最新更新