Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-11731

Servlet Component isn't really async

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.18.4, 2.19.2
    • 3.7.0
    • camel-servlet
    • None
    • All

    • Moderate

    Description

      So my assumption reading the servlet component doco is that with 2.18+ and a Servlet 3+ container, the component supports async, which it kind of does with the async=true init config, and there is even a method in CamelServlet called "doServiceAsync" but from what i can tell it doesn't really do it in a asynchronous manner, where there are no blocked threads while a request is awaiting an async operation (like an AHC call for example).

      Looking at:
      https://github.com/apache/camel/blob/master/components/camel-http-common/src/main/java/org/apache/camel/http/common/CamelServlet.java

      While processing a request, we check if we are in async mode and call doServiceAsync..

       @Override
          protected final void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              if (isAsync()) {
                  final AsyncContext context = req.startAsync();
                  //run async
                  context.start(() -> doServiceAsync(context));
              } else {
                  doService(req, resp);
              }
          }
      

      then in doServiceAsync() we call doService().. and then we call getProcessor().process(exchange), not process(exchange, asyncCallback) which is the proper async method..

      try {
                  if (log.isTraceEnabled()) {
                      log.trace("Processing request for exchangeId: {}", exchange.getExchangeId());
                  }
                  // process the exchange
                  consumer.getProcessor().process(exchange);
              } catch (Exception e) {
                  exchange.setException(e);
              }
      

      So the actual behaviour is an inbound request in async mode that ends up just blocking waiting for the request to complete, in a totally sync manner. I presume this is not the desired behaviour?

      It seems the fix would be to move the doService() logic to doServiceAsync() and have doService() call it and use the AsyncProcessorConverterHelper. Or the other alternative would be to update the documentation to explicitly note that it is actually not async at all.

      I can probably PR it in, just wanted to get thoughts on the actual intention.

      Attachments

        Activity

          People

            Unassigned Unassigned
            nhoughto Nick Houghton
            Votes:
            1 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: