ddms
ddms

Reputation: 50

Camel exchange expired via jetty continuation

Is there a possibility in Apache Camel to register a handler for managing exchanges that cannot be written to jetty endpoint http response because continuation timeout has been reached?

Upvotes: 1

Views: 472

Answers (2)

micfra
micfra

Reputation: 2820

I'll just add my notes on that because I made it available in my project by modifying CamelContinuationServlet in the if (continuation.isExpired()) block like this

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;
}

in combination with a custom HttpBinding called ErrorHandlingHttpBinding in my code like this

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);
    }
  }
}

registered as spring bean with id="errorHandlingHttpBinding" and referred in the component string as jetty:http://localhost:21010/?useContinuation=true&continuationTimeout=1&httpBindingRef=errorHandlingHttpBinding.

Upvotes: 2

Claus Ibsen
Claus Ibsen

Reputation: 55750

No this is not possible. Maybe you need to set a higher timeout if you have some slow processing exchanges.

You are welcome to dive in the Jetty APIs to see if you can find a hook for such a onTimeout event and see what it takes to support that in camel-jetty.

Upvotes: 1

Related Questions