当前位置: 首页 > 知识库问答 >
问题:

使用建议处理MessageHandlingException并继续spring集成dsl的流程

宣熙云
2023-03-14

我试图抑制从http出站网关为非2XX状态代码生成的MessageHandlingException,并将控制优雅地返回到父流,以便按照成功流中的预期在回复通道上返回具有原始有效负载的消息。

原始代码:

 @Bean
  public IntegrationFlow inquiry() {
    return flow -> flow
    .handle(Http
                .outboundGateway("url", restTemplate)
                .mappedRequestHeaders("*")
                .headerMapper(headerMapper)
                .extractPayload(true)
                .httpMethod(HttpMethod.POST)
                .expectedResponseType(expectedResponseType.class)
            )

我尝试在Http上使用errorHandler,但它为客户端响应提供了一个句柄,并且原始负载不是它的一部分。

也尝试了表达建议的途径。

@Bean
  public IntegrationFlow inquiry() {
    return flow -> flow
    .handle(Http
                    .outboundGateway("url", restTemplate)
                    .mappedRequestHeaders("*")
                    .headerMapper(headerMapper)
                    .extractPayload(true)
                    .httpMethod(HttpMethod.POST)
                    .expectedResponseType(expectedResponseType.class)
                , c->c.advice(expresionAdvice())) 

如果没有成功,则通知不会返回控件

也许最简单的方法就是把纸包起来。处理try。。捕获并捕获MessageHandlingException,将其传播到@ExceptionHandler并对其进行转换。

有没有一种方法可以通过advice或errorChannel来实现,在@MessagingGateway上尝试了errorChannel,但在http出站网关发出404后,它不会被调用。

上面的代码是另一个流的一部分,正在独立测试这个流。

integrationFlow是否存在错误通道?

更新1:

能够找出为什么@MessagingGateway上的错误通道没有从测试中调用,它只在调用完整流时才被调用,而不是使用DirectChannel的查询()方法。

现在errorChannel正在工作,请使用异常之前的有效负载状态设置一个自定义头,并从failedMessage头访问它。

它现在正按预期工作,并且从不将错误抛回响应。感觉这是一个工作...

有什么方法可以在建议中更好地处理这个问题吗?

编辑1:

代码不完整,我试图让它工作

@Bean
  public Advice expressionAdvice() {
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setOnSuccessExpressionString("payload");
    advice.setOnFailureExpressionString("payload");
    advice.setTrapException(true);
    return advice;
  }

由于我没有指定的渠道流从建议,流是无处可去,需要一些东西,如. defaultOutputTo父母流(),以便它返回到父流与Message

回答:

它工作了,但唯一的问题是,我仍然需要自定义头来获取原始有效负载,而不是请求失败有效负载/主体,以便流程继续。

@Bean
  public Advice expressionAdvice() {
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setOnSuccessExpressionString("payload");
    advice.setOnFailureExpressionString("headers['CUSTOM_KEY']");
    advice.setTrapException(true);
    advice.setReturnFailureExpressionResult(true);
    return advice;
  }

这就是我要找的。可能是更改变量名称,因为建议将在成功时返回,而不仅仅是失败的情况。

共有1个答案

巫马瀚漠
2023-03-14

您还需要在ExpressionEvalue atingDemestHandlerAdwn中将this配置true

/**
 * If true, the result of evaluating the onFailureExpression will
 * be returned as the result of AbstractReplyProducingMessageHandler.handleRequestMessage(Message).
 *
 * @param returnFailureExpressionResult true to return the result of the evaluation.
 */
public void setReturnFailureExpressionResult(boolean returnFailureExpressionResult) {
    this.returnFailureExpressionResult = returnFailureExpressionResult;
}
 类似资料:
  • 在我的spring integration应用程序中,我有一个异步网关方法,它指定了errorChannel。 On Error-我希望通过向ErrorChannel注册集成流来处理错误(我能够成功地做到这一点)。 一旦错误被处理和处理,我可能需要有条件地发送到另一个通道进行进一步处理,并在最后回复回网关。实现这一点的最佳方法是什么? 示例-> 我如何做到这一点?

  • Spring Integration Java DSL Reference和Spring Batch Java配置文档说明了如何将Java配置用于Spring Integration和Spring Batch。 但它们没有说明如何为Spring批处理集成配置它。如何使用DSL配置JobLaunchingGateway? 干杯,曼诺

  • 我在我的项目中使用Spring集成,使用的模式是分散收集。这里正在执行三个并行过程。流2是一个出站网关方法,如果该服务关闭,那么我想处理Httpstatus异常并希望发送null。实际上,如果该服务关闭,那么整个流程就会停止。但我想处理那个异常并发送null,然后想继续使用聚合方法并结束流程。 以下是代码-- //配置文件 网关 我可以使用类似于?但是我该怎么用呢? 我正在做这样的事情,但得到如下

  • 我希望能够使用在作业配置中定义的以相同的参数(基本上是相同的文件)重新启动作业(可能是因为应用程序已经重新启动,或者由于某些原因我们再次收到了相同的文件)。 不幸的是,run.id=1没有增加,我得到一个 作业配置 多谢

  • 我有一个正在工作的Spring Boot/批处理项目,包含2个作业。 我现在尝试添加集成,仅使用java配置/java DSL从远程SFTP轮询文件,然后启动作业。 文件轮询工作正常,但我不知道如何在我的流中启动作业,尽管阅读了以下链接: 一些代码段: 对于.handle(“FileMessageToJobRequest”,“ToRequest”),我使用的是http://docs.spring.

  • 我已经建立了一个简单的Spring集成流程,该流程由以下步骤组成: 然后定期轮询一个rest api 对有效载荷做一些处理 并将其置于Kafka主题上。 请遵守以下代码: 这非常有效,然而,我正在努力想出一些好的测试。 我应该如何模拟外部RESTAPI