This is an automated email from the ASF dual-hosted git repository. orpiske pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit d5916968c451bffc7128238204799b223f122844 Author: Otavio Rodolfo Piske <angusyo...@gmail.com> AuthorDate: Sun May 12 09:05:51 2024 +0200 (chores) camel-http-common: code cleanup - break large and complex methods --- .../org/apache/camel/http/common/CamelServlet.java | 154 ++++++++++++--------- 1 file changed, 90 insertions(+), 64 deletions(-) diff --git a/components/camel-http-common/src/main/java/org/apache/camel/http/common/CamelServlet.java b/components/camel-http-common/src/main/java/org/apache/camel/http/common/CamelServlet.java index a3fb1eaaaf4..0c601e739c4 100644 --- a/components/camel-http-common/src/main/java/org/apache/camel/http/common/CamelServlet.java +++ b/components/camel-http-common/src/main/java/org/apache/camel/http/common/CamelServlet.java @@ -137,7 +137,8 @@ public class CamelServlet extends HttpServlet implements HttpRegistryProvider { } } - private void doAsyncExecution(HttpServletRequest req, HttpServletResponse resp, HttpConsumer consumer, AsyncContext context) { + private void doAsyncExecution( + HttpServletRequest req, HttpServletResponse resp, HttpConsumer consumer, AsyncContext context) { try { final CompletionStage<?> promise = doExecute(req, resp, consumer); if (promise == null) { // early quit @@ -169,31 +170,37 @@ public class CamelServlet extends HttpServlet implements HttpRegistryProvider { if (camelContext.isStopping() || camelContext.isStopped()) { // shouldn't occur but as a protection return null; } - return executorServicePerContext.computeIfAbsent(camelContext, ctx -> { - ExecutorServiceManager manager = camelContext.getExecutorServiceManager(); - ExecutorService es = manager.newThreadPool(this, getClass().getSimpleName() + "Executor", executorRef); - if (es == null) { - getServletContext().log( - "ExecutorServiceRef " + executorRef + " not found in registry (as an ExecutorService instance) " + - "or as a thread pool profile, will default for " + ctx.getName() + "."); - es = manager.newDefaultThreadPool(this, getClass().getSimpleName() + "Executor"); - } - ctx.addLifecycleStrategy(new LifecycleStrategySupport() { - @Override - public void onContextStopping(final CamelContext context) { - final ExecutorService service = executorServicePerContext.remove(context); - if (service != null && !service.isShutdown() && !service.isTerminated()) { - service.shutdownNow(); - try { // give it a chance to finish before quitting - service.awaitTermination(1, MINUTES); - } catch (final InterruptedException e) { - Thread.currentThread().interrupt(); - } + return executorServicePerContext.computeIfAbsent(camelContext, ctx -> createExecutorService(ctx, camelContext)); + } + + private ExecutorService createExecutorService(CamelContext ctx, CamelContext camelContext) { + ExecutorServiceManager manager = camelContext.getExecutorServiceManager(); + ExecutorService es = manager.newThreadPool(this, getClass().getSimpleName() + "Executor", executorRef); + if (es == null) { + getServletContext().log( + "ExecutorServiceRef " + executorRef + " not found in registry (as an ExecutorService instance) " + + "or as a thread pool profile, will default for " + ctx.getName() + "."); + es = manager.newDefaultThreadPool(this, getClass().getSimpleName() + "Executor"); + } + ctx.addLifecycleStrategy(createLifecycleStrategy()); + return es; + } + + private LifecycleStrategySupport createLifecycleStrategy() { + return new LifecycleStrategySupport() { + @Override + public void onContextStopping(final CamelContext context) { + final ExecutorService service = executorServicePerContext.remove(context); + if (service != null && !service.isShutdown() && !service.isTerminated()) { + service.shutdownNow(); + try { // give it a chance to finish before quitting + service.awaitTermination(1, MINUTES); + } catch (final InterruptedException e) { + Thread.currentThread().interrupt(); } } - }); - return es; - }); + } + }; } /** @@ -240,21 +247,7 @@ public class CamelServlet extends HttpServlet implements HttpRegistryProvider { // if its an OPTIONS request then return which method is allowed if ("OPTIONS".equals(req.getMethod()) && !consumer.isOptionsEnabled()) { - String allowedMethods = METHODS.stream() - .filter(m -> getServletResolveConsumerStrategy().isHttpMethodAllowed(req, m, getConsumers())) - .collect(Collectors.joining(",")); - if (allowedMethods == null && consumer.getEndpoint().getHttpMethodRestrict() != null) { - allowedMethods = consumer.getEndpoint().getHttpMethodRestrict(); - } - if (allowedMethods == null) { - // allow them all - allowedMethods = "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH"; - } - if (!allowedMethods.contains("OPTIONS")) { - allowedMethods = allowedMethods + ",OPTIONS"; - } - res.addHeader("Allow", allowedMethods); - res.setStatus(HttpServletResponse.SC_OK); + performOptionsRequest(req, res, consumer); return null; } @@ -315,19 +308,7 @@ public class CamelServlet extends HttpServlet implements HttpRegistryProvider { final Processor processor = consumer.getProcessor(); isAsync = isAsync() && !forceAwait && AsyncProcessor.class.isInstance(processor); if (isAsync) { - result = AsyncProcessor.class.cast(processor) - .processAsync(exchange) - .whenComplete((r, ex) -> { - if (ex != null) { - exchange.setException(ex); - } else { - try { - afterProcess(res, consumer, exchange, false); - } catch (Exception e) { - exchange.setException(e); - } - } - }); + result = tryAsyncProcess(res, consumer, processor, exchange); } else { processor.process(exchange); } @@ -345,6 +326,43 @@ public class CamelServlet extends HttpServlet implements HttpRegistryProvider { return result; } + private CompletionStage<?> tryAsyncProcess( + HttpServletResponse res, HttpConsumer consumer, Processor processor, Exchange exchange) { + CompletionStage<?> result; + result = AsyncProcessor.class.cast(processor) + .processAsync(exchange) + .whenComplete((r, ex) -> { + if (ex != null) { + exchange.setException(ex); + } else { + try { + afterProcess(res, consumer, exchange, false); + } catch (Exception e) { + exchange.setException(e); + } + } + }); + return result; + } + + private void performOptionsRequest(HttpServletRequest req, HttpServletResponse res, HttpConsumer consumer) { + String allowedMethods = METHODS.stream() + .filter(m -> getServletResolveConsumerStrategy().isHttpMethodAllowed(req, m, getConsumers())) + .collect(Collectors.joining(",")); + if (allowedMethods == null && consumer.getEndpoint().getHttpMethodRestrict() != null) { + allowedMethods = consumer.getEndpoint().getHttpMethodRestrict(); + } + if (allowedMethods == null) { + // allow them all + allowedMethods = "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH"; + } + if (!allowedMethods.contains("OPTIONS")) { + allowedMethods = allowedMethods + ",OPTIONS"; + } + res.addHeader("Allow", allowedMethods); + res.setStatus(HttpServletResponse.SC_OK); + } + protected void afterProcess( HttpServletResponse res, HttpConsumer consumer, Exchange exchange, boolean rethrow) @@ -361,25 +379,33 @@ public class CamelServlet extends HttpServlet implements HttpRegistryProvider { } consumer.getBinding().writeResponse(exchange, res); } catch (IOException e) { - log.error("Error processing request", e); - if (rethrow) { - throw e; - } else { - exchange.setException(e); - } + handleIOException(exchange, rethrow, e); } catch (Exception e) { - log.error("Error processing request", e); - if (rethrow) { - throw new RuntimeCamelException(e); - } else { - exchange.setException(e); - } + handleException(exchange, rethrow, e); } finally { consumer.doneUoW(exchange); consumer.releaseExchange(exchange, false); } } + private void handleException(Exchange exchange, boolean rethrow, Exception e) { + log.error("Error processing request", e); + if (rethrow) { + throw new RuntimeCamelException(e); + } else { + exchange.setException(e); + } + } + + private void handleIOException(Exchange exchange, boolean rethrow, IOException e) throws IOException { + log.error("Error processing request", e); + if (rethrow) { + throw e; + } else { + exchange.setException(e); + } + } + private HttpConsumer doResolve(HttpServletRequest request, HttpServletResponse response) throws Exception { // Is there a consumer registered for the request. HttpConsumer consumer = getServletResolveConsumerStrategy().resolve(request, getConsumers());