Apache Camel:无法获得异常体

时间:2016-12-07 01:40:41

标签: apache-camel esb jbossfuse

每当我的Camel Routes中有正常的流量时,我就可以将身体放入下一个组件中。但是每当有异常(Http 401或500)时,我都无法获得异常体。我刚在服务器日志中遇到java异常。 我也尝试过onException()..使用它会在出错时进入它,但我仍然没有得到Web服务发送的错误响应主体(我直接使用POSTMAN时得到),我只得到了请求我已发送到网络服务的正文。

同时添加路线:

from("direct:contractUpdateAds")
        .to("log:inside_direct:contractUpdateAds_route_CompleteLog?level=INFO&showAll=true&multiline=true")
        .streamCaching()
        .setHeader(Exchange.HTTP_METHOD, constant("POST"))
        .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
        .log("before calling ADS for ContractUpdate:\nBody:${body}")
        .to("{{AdsContractUpdateEndpoint}}")
        .log("after calling ADS for ContractUpdate:\nBody:${body}")
        .convertBodyTo(String.class)
        .end();

1 个答案:

答案 0 :(得分:5)

选项1:自行处理失败状态代码

throwExceptionOnFailure=false endpoint option(至少可用于camel-httpcamel-http4个端点)可能就是您想要的。使用此选项,camel-http将不再将HTTP状态> = 300视为错误,并允许您决定要执行的操作 - 包括处理您认为合适的响应正文。

这些方面应该有效:

from("...")
.to("http://{{hostName}}?throwExceptionOnFailure=false")
.choice()
    .when(header(Exchange.HTTP_RESPONSE_CODE).isLessThan(300))
        // HTTP status < 300
        .to("...")
    .otherwise()
        // HTTP status >= 300 : would throw an exception if we had "throwExceptionOnFailure=true"
        .log("Error response: ${body}")
        .to("...");

如果您想对某些状态代码进行特殊处理,这是一种有趣的方法。请注意,逻辑可以通过使用direct端点在多个路由中重用,就像任何其他Camel路由逻辑一样。

选项2:访问onException中的HttpOperationFailedException

如果您想保留默认错误处理,但由于某种原因想要访问异常处理代码中的响应正文,则只需访问responseBody上的HttpOperationFailedException属性即可。

以下是一个例子:

onException(HttpOperationFailedException.class)
.process(new Processor() {
    @Override
    public void process(Exchange exchange) throws Exception {
        // e won't be null because we only catch HttpOperationFailedException;
        // otherwise, we'd need to check for null.
        final HttpOperationFailedException e =
                exchange.getProperty(Exchange.EXCEPTION_CAUGHT, HttpOperationFailedException.class);
        // Do something with the responseBody
        final String responseBody = e.getResponseBody();
    }
});