【问题标题】:Apache Camel return producer errorsApache Camel 返回生产者错误
【发布时间】:2021-12-29 13:14:36
【问题描述】:

我有一个简单的代理配置,如下所示:

from("netty-http://0.0.0.0:8080/xyz")
    .toD("netty-http:" + "https://abc/xyu")
    .process(this::processResponse);

但是当 abc 服务返回 400 并带有可读错误时,camel 返回自己的异常:

org.apache.camel.component.netty.http.NettyHttpOperationFailedException: Netty HTTP operation failed invoking

我可以做些什么来简单地从生产者服务返回错误?

【问题讨论】:

    标签: apache-camel quarkus


    【解决方案1】:

    您可以尝试将throwExceptionOnFailure 选项设置为false。 Camel 中的 Http 组件默认启用此功能,可能是为了像 Camel 中的任何其他异常一样轻松捕获和处理故障。

    启用后,您可以通过 Exchange 属性获取异常和有关异常的详细信息,在此追逐中,您可能可以将其转换为 NettyHttpOperationFailedException 以获取有关它的更多信息。

    Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
    

    【讨论】:

    • 谢谢,现在http状态传输正确,但body仍然丢失。
    • 您是否使用 curl 或 postman 之类的工具测试过 abc 服务,以查看它是否确实响应了正文?如果 throwExceptionOnFailure 设置为 false,camel 应该将响应提供的任何正文和标头分配给消息。
    • 您还可以尝试使用.to("log:response?showAll=true") 获取更多信息,以使骆驼日志成为当前消息正文和标头,以获取有关实际返回内容的更多信息。 (不同的是,这会记录所有标头,包括您可能已设置为骆驼标头的凭据)
    • 太好了,我可以将throwExceptionOnFailure 设置为我的配置中的所有路由吗?
    • 如果您设法以某种方式配置netty-http 组件,则可能有可能,但不幸的是,当涉及到在路由定义之外配置组件等高级场景时,文档有点稀疏。可能更容易使用字符串来保存共享选项或使用方法来构造具有正确设置的 URI。
    【解决方案2】:

    我遇到了类似的码头问题 (Apache-Camel / Camel-Jetty / Don't return exception-stack-trace in case of 401 response)

    就我而言,bridgeEndpoint=truethrowExceptionOnFailure=false 选项解决了这个问题(http 401 除外)

    from("netty-http://0.0.0.0:8080/xyz")
        .toD("netty-http:" + "https://abc/xyu?bridgeEndpoint=true&throwExceptionOnFailure=false")
        .process(this::processResponse);
    

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多