Spring集成:使用oubound网关处理http错误

时间:2015-10-05 09:29:41

标签: spring-integration

如何处理http出站网关中的异常? 当我收到状态代码500或400 ...时,会显示异常。那么我应该怎么做才能使用spring集成处理http错误。

我的配置如下:

f <- function(x) {
    sum(is.na(x)) < length(x) * 0.2
}

df[, vapply(df, f, logical(1)), drop = F]

我想知道为什么异常会转到回复频道

3 个答案:

答案 0 :(得分:1)

  

我想知道为什么异常没有去回复频道

因为处理异常是很自然的,例如,呃,例外。

有(至少)两种方法来处理Spring Integration中的异常。

  1. 在启动流量的任何内容(例如网关)上添加error-channel和关联的流。错误通道获得ErrorMessage有效载荷MessagingException;该例外有两个属性 - failedMessagecause
  2. 向网关添加ExpressionEvaluatingRequestHandlerAdvice(或自定义建议);见Adding Behavior to Endpoints

答案 1 :(得分:1)

如果响应状态代码位于HTTP系列 CLIENT_ERROR SERVER_ERROR 中,则会抛出 HttpClientErrorException HttpServerErrorException 分别。因此,响应不会转到回复频道

  

参考DefaultResponseErrorHandler
  方法:hasError和handleError

要处理这些异常,请创建自己的CustomResponseErrorHandler并覆盖hasError和handlerError方法的内容。

public class CustomResponseErrorHandler extends DefaultResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return hasError(getHttpStatusCode(response));
    }

    protected boolean hasError(HttpStatus statusCode) {
        return /*Status Code to be considered as Error*/ ;
    }

    @Override
    public void handleError(ClientHttpResponse response) throws IOException { /* Handle Exceptions */
    }
}  

错误处理程序添加到http-outbound-gateway

<int-http:outbound-gateway id="quakerHttpGateway"
    request-channel="quakeinfotrigger.channel" url="http://fooo/mmmm/rest/put/44545454"
    http-method="PUT" expected-response-type="java.lang.String" charset="UTF-8"
    reply-timeout="5000" reply-channel="quakeinfo.channel" error-handler="customResponseErrorHandler">
</int-http:outbound-gateway>

答案 2 :(得分:0)

我也遇到了同样的问题。我抛出了自己的自定义异常和错误消息,但始终收到“ 500 Internal server error”。这是因为在抛出Exception时将没有答复消息并且“答复”超时。因此我处理订阅错误通道,然后由我自己回复即可。

Message<?> failedMessage = exception.getFailedMessage();
Object replyChannel = new MessageHeaderAccessor(failedMessage).getReplyChannel();
if (replyChannel != null) {
    ((MessageChannel) replyChannel).send(MessageFactory.createDataExchangeFailMessage(exception));
}