骆驼交换通过码头延续到期

时间:2016-04-15 20:36:31

标签: jetty apache-camel

Apache Camel是否有可能注册一个处理程序来管理无法写入jetty端点http响应的交换,因为已达到持续超时?

2 个答案:

答案 0 :(得分:2)

我只是添加我的注释,因为我通过修改if (continuation.isExpired())块中的CamelContinuationServlet使其在我的项目中可用

if (continuation.isExpired()) {
  String id = (String) continuation.getAttribute(EXCHANGE_ATTRIBUTE_ID);
  // remember this id as expired
  expiredExchanges.put(id, id);
  log.warn("Continuation expired of exchangeId: {}", id);

  consumer.getBinding().doWriteExceptionResponse(new TimeoutException(), response);

  return;
}

与我的代码中名为ErrorHandlingHttpBinding的自定义HttpBinding结合使用,如此

public class ErrorHandlingHttpBinding extends DefaultHttpBinding {

  @Override
  public void doWriteExceptionResponse(Throwable exception, HttpServletResponse response) throws IOException {
    if (exception instanceof TimeoutException) {
        response.setStatus(HttpServletResponse.SC_GATEWAY_TIMEOUT);
        response.getWriter().write("Continuation timed out...");            
    } else {
      super.doWriteExceptionResponse(exception, response);
    }
  }
}

使用id="errorHandlingHttpBinding"注册为spring bean,并在组件字符串中引用为jetty:http://localhost:21010/?useContinuation=true&continuationTimeout=1&httpBindingRef=errorHandlingHttpBinding

答案 1 :(得分:1)

不,这是不可能的。如果您有一些缓慢的处理交换,可能需要设置更高的超时。

欢迎您潜入Jetty API,看看是否可以找到这样的onTimeout事件的钩子,看看在camel-jetty中支持它的方法。