[
https://issues.apache.org/jira/browse/CAMEL-11731?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-11731.
---------------------------------
Fix Version/s: (was: Future)
3.7.0
Resolution: Fixed
> Servlet Component isn't really async
> ------------------------------------
>
> Key: CAMEL-11731
> URL: https://issues.apache.org/jira/browse/CAMEL-11731
> Project: Camel
> Issue Type: Improvement
> Components: camel-servlet
> Affects Versions: 2.18.4, 2.19.2
> Environment: All
> Reporter: Nick Houghton
> Priority: Major
> Fix For: 3.7.0
>
>
> 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..
> {code:java}
> @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);
> }
> }
> {code}
> then in doServiceAsync() we call doService().. and then we call
> getProcessor().process(exchange), not process(exchange, asyncCallback) which
> is the proper async method..
> {code:java}
> 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);
> }
> {code}
> 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.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)