Apache Camel是否有可能注册一个处理程序来管理无法写入jetty端点http响应的交换,因为已达到持续超时?
答案 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中支持它的方法。