roh*_*han 2 esb apache-camel jbossfuse
只要我的骆驼路线中有正常流量,我就可以使身体进入下一个组成部分。但是,只要有异常(Http 401或500),我就无法获取异常主体。我在服务器日志中仅收到一个Java异常。我也尝试过onException()。使用它,当错误发生时流程就进入了流程,但是我仍然没有得到Web服务发送的错误响应正文(直接在使用POSTMAN时得到),我只得到了我发送到Web服务的正文中的请求。
同时添加路线:
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();
Run Code Online (Sandbox Code Playgroud)
选项1:自己处理故障状态代码
该throwExceptionOnFailure =伪终点选项(可至少camel-http和camel-http4终点)可能是你想要的东西。使用此选项,camel-http将不再将HTTP Status> = 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("...");
Run Code Online (Sandbox Code Playgroud)
例如,如果您想对某些状态代码进行特殊处理,这是一种有趣的方法。请注意,可以使用direct端点在多个路由中重用该逻辑,就像其他任何骆驼路由逻辑一样。
选项2:HttpOperationFailedException在onException中访问
如果要保留默认的错误处理,但是由于某种原因要在异常处理代码中访问响应正文,则只需访问上的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();
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2987 次 |
| 最近记录: |