| <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>OnCompletion :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/oncompletion.html"> <meta name="generator" content="Antora 3.1.7"> <link rel="stylesheet" href="../_/css/site-2955eb42a8.css"> <meta name="application-name" content="Apache Camel"> <meta property="og:title" content="OnCompletion"> <meta property="og:site_name" content="Apache Camel"> <meta property="og:url" content="https://camel.apache.org"> <meta property="og:description" content="Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data."> <meta property="og:type" content="website"> <meta property="og:image" content="https://camel.apache.org/_/img/logo-d-a567cee6fa.svg"> <link rel="manifest" href="../site.webmanifest"> <link rel="apple-touch-icon-precomposed" sizes="57x57" href="../apple-touch-icon-57x57.png"> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../apple-touch-icon-114x114.png"> <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../apple-touch-icon-72x72.png"> <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../apple-touch-icon-144x144.png"> <link rel="apple-touch-icon-precomposed" sizes="60x60" href="../apple-touch-icon-60x60.png"> <link rel="apple-touch-icon-precomposed" sizes="120x120" href="../apple-touch-icon-120x120.png"> <link rel="apple-touch-icon-precomposed" sizes="76x76" href="../apple-touch-icon-76x76.png"> <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../apple-touch-icon-152x152.png"> <link rel="icon" type="image/png" href="../favicon-196x196.png" sizes="196x196"> <link rel="icon" type="image/png" href="../favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="../favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="../favicon-16x16.png" sizes="16x16"> <link rel="icon" type="image/png" href="../favicon-128.png" sizes="128x128"> </head> <body class="article"> <header class="header"> <nav class="navbar" aria-label="Main menu"> <div class="navbar-brand"> <a class="nav-logo" href=".."></a> <div id="topbar-nav" class="navbar-menu"> <div class="navbar-end"> <a class="navbar-item-section navbar-item navbar-topics" href="../blog/"> <img alt="Blog" src="/_/img/blog-4c7fa4cb60.svg"> Blog </a> <a class="navbar-item-section navbar-item navbar-topics" href="../docs/"> <img alt="Documentation" src="/_/img/documentation-abb1b7f8b1.svg"> Documentation </a> <a class="navbar-item-section navbar-item navbar-topics" href="../community/"> <img alt="Community" src="/_/img/community-2ec8a3dc8b.svg"> Community </a> <a class="navbar-item-section navbar-item navbar-topics" href="../download/"> <img alt="Download" src="/_/img/download-63cdd75074.svg"> Download </a> <a class="navbar-item-section navbar-item navbar-topics" href="../security/"> <img alt="Security" src="/_/img/security-06abe157b3.svg"> Security </a> </div> </div> <div class="navbar-fill"></div> <div class="break-row"></div> <div class="navbar-search results-hidden"> <input id="search" class="search" placeholder="Search" autocomplete="off"> <img src="../_/img/cancel-1ed239489b.svg" alt="Clear" id="search-cancel"> <div id="search_results"></div> </div> <div class="navbar-tools"> <a rel="noopener noreferrer nofollow" href="https://github.com/apache/camel/" title="Collaborate on GitHub"><svg focusable="false" class="brand-icon"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#github"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://camel.zulipchat.com" title="Chat on Zulip"><svg focusable="false" class="brand-icon"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#zulip"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://twitter.com/ApacheCamel" title="Follow Apache Camel on Twitter"><svg focusable="false" class="brand-icon"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#twitter"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://www.linkedin.com/groups/2447439/" title="Apache Camel group on Linkedin"><svg focusable="false" class="brand-icon"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#linkedin"/></svg></a> </div> <button class="navbar-burger" data-target="topbar-nav" type="button" aria-label="Menu"> <span></span> <span></span> <span></span> </button> </div> </nav> </header> <a id="top"></a> <div class="body"> <div class="nav-container" data-component="manual" data-version=""> <aside class="nav" aria-label="Side menu"> <div class="panels"> <div class="nav-panel-menu is-active"> <nav class="nav-menu" data-panel="menu" aria-label="Topics"> <h3 class="title"><a href="index.html">User manual</a></h3> <ul class="nav-list"> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="getting-started.html">Getting started</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="book-getting-started.html">Getting Started with Apache Camel</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="what-are-the-dependencies.html">What are the dependencies?</a> </li> </ul> </li> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <span class="nav-text">Resources & Guides</span> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="/community/books/">Books</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="building.html">Building</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-console.html">Camel Developer Console</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="camel-jbang.html">Camel JBang</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="camel-jbang-kubernetes.html">Camel Kubernetes plugin</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="camel-jbang-test.html">Camel Testing plugin</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-maven-plugin.html">Camel Maven Plugin</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-component-maven-plugin.html">Camel Component Maven Plugin</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-report-maven-plugin.html">Camel Maven Report Plugin</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-maven-archetypes.html">Camel Maven Archetypes</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="configuring-route-startup-ordering-and-autostartup.html">Configuring route startup ordering and autostartup</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="component-dsl.html">Component DSL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="Endpoint-dsl.html">Endpoint DSL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dataformat-dsl.html">DataFormat DSL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="examples.html">Examples</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="graceful-shutdown.html">Graceful Shutdown</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="error-handler.html">Error handler</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="using-propertyplaceholder.html">How to use Camel property placeholders</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="variables.html">How to use Variables</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="testing.html">Testing</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="test-infra.html">Test Infra</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="notify-builder.html">NotifyBuilder</a> </li> <li class="nav-item" data-depth="3"> <a class="nav-link" href="advice-with.html">AdviceWith</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="rest-dsl.html">Working with REST and Rest DSL</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="rest-dsl-openapi.html">Rest DSL contract first</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="writing-components.html">Writing Components</a> </li> <li class="nav-item" data-depth="2"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="release-guide.html">Release guide</a> <ul class="nav-list"> <li class="nav-item" data-depth="3"> <a class="nav-link" href="release-guide-website.html">Adding doc versions to the website</a> </li> </ul> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="improving-the-documentation.html">Improving the Documentation</a> </li> </ul> </li> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="migration-and-upgrade.html">Migration and Upgrade</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-3-migration-guide.html">Camel 2.x to 3.0 Migration Guide</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-3x-upgrade-guide.html">Camel 3.x Upgrade Guide</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-4-migration-guide.html">Camel 3.x to 4.0 Migration Guide</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camel-4x-upgrade-guide.html">Camel 4.x Upgrade Guide</a> </li> </ul> </li> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="architecture.html">Architecture</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="backlog-debugger.html">Backlog debugger</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="backlog-tracer.html">Backlog Tracer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="batch-consumer.html">Batch Consumer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="bean-binding.html">Bean Binding</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="bean-integration.html">Bean Integration</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="browsable-endpoint.html">BrowsableEndpoint</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camelcontext.html">CamelContext</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="camelcontext-autoconfigure.html">CamelContext Auto Configuration</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="clustering.html">Clustering and Load Balancing</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="component.html">Component</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="data-format.html">Data Format</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="debugger.html">Debugger</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="delay-interceptor.html">Delayer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="endpoint.html">Endpoints</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="endpoint-annotations.html">Endpoint Annotations</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="exception-clause.html">Exception Clause</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="exchange-pooling.html">Exchange Pooling</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="http-session-handling.html">HTTP-Session Handling</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="parameter-binding-annotations.html">Parameter Binding Annotations</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pojo-producing.html">POJO Producing</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pojo-consuming.html">POJO Consuming</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="producertemplate.html">ProducerTemplate</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="consumertemplate.html">ConsumerTemplate</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="error-handler.html">Error Handler</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="exchange.html">Message Exchange</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="exchange-pattern.html">Exchange Pattern</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="using-exchange-pattern-annotations.html">Using Exchange pattern annotations</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="expression.html">Expressions</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="../components/4.10.x/eips/content-enricher.html">Content Enrichment</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="injector.html">Injector</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="../components/4.10.x/eips/intercept.html">Intercept</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="jmx.html">JMX</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="lifecycle.html">Camel Lifecycle</a> </li> <li class="nav-item is-current-page" data-depth="2"> <a class="nav-link" href="oncompletion.html">OnCompletion</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="pluggable-class-resolvers.html">Pluggable Class Resolvers</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="predicate.html">Predicates</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="processor.html">Processor</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="registry.html">Registry</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="route-builder.html">RouteBuilder</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="lambda-route-builder.html">LambdaRouteBuilder</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="route-controller.html">RouteController</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="route-policy.html">RoutePolicy</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="route-configuration.html">RouteConfiguration</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="context-reload.html">ContextReload</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="route-reload.html">RouteReload</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="route-template.html">RouteTemplate</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="routes.html">Routes</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="startup-condition.html">Startup Condition</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="stream-caching.html">Stream caching</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="template-engines.html">Template Engines</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="transformer.html">Transformer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="threading-model.html">Threading Model</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="tracer.html">Tracer</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="type-converter.html">Type Converter</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="uris.html">URIs</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="uuidgenerator.html">UuidGenerator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="validator.html">Validator</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="health-check.html">Health Checks</a> </li> </ul> </li> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <span class="nav-text">Domain Specific Languages</span> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="dsl.html">Camel Domain Specific Language</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages.html">Languages</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="java-dsl.html">Java DSL</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="spring.html">Spring support</a> </li> </ul> </li> </ul> </li> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <button class="nav-item-toggle" type="button" aria-label="Expand or contract topic"></button> <a class="nav-link" href="faq/index.html">FAQ</a> <ul class="nav-list"> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/can-i-get-commercial-support.html">Can I get commercial support?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="/community/support/">How can I get help?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-can-i-get-the-source-code.html">How can I get the source code?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-does-camel-work.html">How does Camel work?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-does-the-website-work.html">How does the website work?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-become-a-committer.html">How do I become a committer?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-compile-the-code.html">How do I compile the code?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-edit-the-website.html">How do I edit the website?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/running-camel-standalone.html">Running Camel standalone</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/what-is-a-router.html">What is a router?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/what-is-camel.html">What is Camel?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/what-is-the-license.html">What is the license?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="languages.html">What languages are supported?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/what-platforms-are-supported.html">What platforms are supported?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-the-name-camel.html">Why the name Camel?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-specify-which-method-to-use-when-using-beans-in-routes.html">How do I specify which method to use when using beans in routes?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-can-i-create-a-custom-component-or-endpoint.html">How can I create a custom component or endpoint?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-can-i-get-the-remote-connection-ip-address-from-the-camel-cxf-consumer-.html">How can I get the remote connection IP address from the camel-cxf consumer ?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-can-i-stop-a-route-from-a-route.html">How can I stop a route from a route?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-can-webservice-clients-see-remote-faults-with-stacktraces-when-using-camel-cxf.html">How can webservice clients see remote faults with stacktraces when using camel-cxf?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-does-camel-look-up-beans-and-endpoints.html">How does Camel look up beans and endpoints?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-change-the-logging.html">How do I change the logging?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-configure-endpoints.html">How do I configure endpoints?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-configure-password-options-on-camel-endpoints-without-the-value-being-encoded.html">How do I configure password options on Camel endpoints without the value being encoded?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-configure-the-default-maximum-cache-size-for-producercache-or-producertemplate.html">How do I configure the default maximum cache size for ProducerCache or ProducerTemplate?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-configure-the-maximum-endpoint-cache-size-for-camelcontext.html">How do I configure the maximum endpoint cache size for CamelContext?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-debug-my-route.html">How do I debug my route?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-disable-jmx.html">How do I disable JMX?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-enable-streams-when-debug-logging-messages-in-camel.html">How do I enable streams when debug logging messages in Camel?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-handle-failures-when-consuming-for-example-from-a-ftp-server.html">How do I handle failures when consuming for example from a FTP server?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-import-rests-from-other-xml-files.html">How do I import rests from other XML files?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-import-routes-from-other-xml-files.html">How do I import routes from other XML files?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-let-jetty-match-wildcards.html">How do I let Jetty match wildcards?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-name-my-routes.html">How do I name my routes?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-restart-camelcontext.html">How do I restart CamelContext?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-retrieve-the-thrown-exception-during-processing-an-exchange.html">How do I retrieve the thrown Exception during processing an Exchange?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-retry-failed-messages-forever.html">How do I retry failed messages forever?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-retry-processing-a-message-from-a-certain-point-back-or-an-entire-route.html">How do I retry processing a message from a certain point back or an entire route?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-reuse-the-contexttestsupport-class-in-my-unit-tests.html">How do I reuse the ContextTestSupport class in my unit tests?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-set-the-max-chars-when-debug-logging-messages-in-camel.html">How do I set the max chars when debug logging messages in Camel?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-use-uris-with-parameters-in-xml.html">How do I use URIs with parameters in XML?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-write-a-custom-processor-which-sends-multiple-messages.html">How do I write a custom Processor which sends multiple messages?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-should-i-invoke-my-pojos-or-spring-services.html">How should I invoke my POJOs or Spring Services?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-to-avoid-sending-some-or-all-message-headers.html">How to avoid sending some or all message headers?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-to-remove-the-http-protocol-headers-in-the-camel-message.html">How to remove the http protocol headers in the camel message?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-to-send-the-same-message-to-multiple-endpoints.html">How to send the same message to multiple endpoints?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-to-switch-the-cxf-consumer-between-http-and-https-without-touching-the-spring-configuration.html">How to switch the CXF consumer between HTTP and HTTPS without touching the Spring configuration?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-to-use-a-dynamic-uri-in-to.html">How to use a dynamic URI in to()?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/is-there-an-ide.html">Is there an IDE?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/using-getin-or-getout-methods-on-exchange.html">Using getIn or getOut methods on Exchange</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-cant-i-use-sign-in-my-password.html">Why can’t I use + sign in my password?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-can-i-not-use-when-or-otherwise-in-a-java-camel-route.html">Why can I not use when or otherwise in a Java Camel route?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-does-ftp-component-not-download-any-files.html">Why does FTP component not download any files?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-does-my-file-consumer-not-pick-up-the-file-and-how-do-i-let-the-file-consumer-use-the-camel-error-handler.html">Why does my file consumer not pick up the file, and how do I let the file consumer use the Camel error handler?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-does-useoriginalmessage-with-error-handler-not-work-as-expected.html">Why does useOriginalMessage with error handler not work as expected?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-do-my-message-lose-its-headers-during-routing.html">Why do my message lose its headers during routing?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-is-my-message-body-empty.html">Why is my message body empty?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-is-my-processor-not-showing-up-in-jconsole.html">Why is my processor not showing up in JConsole?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-is-the-exception-null-when-i-use-onexception.html">Why is the exception null when I use onException?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-use-multiple-camelcontext.html">Why use multiple CamelContext?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-enable-debug-logging.html">How do I enable debug logging?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-use-log4j.html">How do I use log4j?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-make-my-jms-endpoint-transactional.html">How Do I Make My JMS Endpoint Transactional?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-i-set-the-mep-when-interacting-with-jbi.html">How do I set the MEP when interacting with JBI?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-the-direct-event-seda-and-vm-endpoints-compare.html">How do the direct, event, seda and vm endpoints compare?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/how-do-the-timer-and-quartz-endpoints-compare.html">How do the Timer and Quartz endpoints compare?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-does-my-jms-route-only-consume-one-message-at-once.html">Why does my JMS route only consume one message at once?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/exception-beandefinitionstoreexception.html">Exception - BeanDefinitionStoreException</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/exception-orgapachecamelnosuchendpointexception.html">Exception - org.apache.camel.NoSuchEndpointException</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/exception-orgxmlsaxsaxparseexception.html">Exception - org.xml.sax.SAXParseException</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/memory-leak-when-adding-and-removing-routes-at-runtime.html">Memory leak when adding and removing routes at runtime</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-does-camel-use-too-many-threads-with-producertemplate.html">Why does Camel use too many threads with ProducerTemplate?</a> </li> <li class="nav-item" data-depth="2"> <a class="nav-link" href="faq/why-does-maven-not-download-dependencies.html">Why does maven not download dependencies?</a> </li> </ul> </li> </ul> </li> <li class="nav-item" data-depth="0"> <ul class="nav-list"> <li class="nav-item" data-depth="1"> <span class="nav-text"><strong>Reference</strong></span> </li> <li class="nav-item" data-depth="1"> <a class="nav-link" href="../components/4.10.x/index.html">Components</a> </li> <li class="nav-item" data-depth="1"> <a class="nav-link" href="../components/4.10.x/dataformats/index.html">Data Formats</a> </li> <li class="nav-item" data-depth="1"> <a class="nav-link" href="../components/4.10.x/languages/index.html">Languages</a> </li> <li class="nav-item" data-depth="1"> <a class="nav-link" href="../components/4.10.x/eips/enterprise-integration-patterns.html">EIPs</a> </li> </ul> </li> </ul> </nav> </div> <div class="nav-panel-explore" data-panel="explore"> <div class="context"> <span class="title noversion">User manual</span> </div> <ul class="components"> <li class="component is-current"> <span class="title"> <a href="index.html">User manual</a> </span></li> <li class="component"><span class="title">Camel Components</span> <ul class="versions"> <li class="version"> <a href="../components/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../components/4.10.x/index.html">4.10.x (LTS)</a> </li> <li class="version"> <a href="../components/4.8.x/index.html">4.8.x (LTS)</a> </li> <li class="version"> <a href="../components/3.22.x/index.html">3.22.x (LTS)</a> </li> </ul></li> <li class="component"> <span class="title"> <a href="../camel-core/index.html">Camel Core</a> </span></li> <li class="component"><span class="title">Camel K</span> <ul class="versions"> <li class="version"> <a href="../camel-k/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../camel-k/2.7.x/index.html">2.7.x (LTS)</a> </li> <li class="version"> <a href="../camel-k/2.5.x/index.html">2.5.x (LTS)</a> </li> </ul></li> <li class="component"><span class="title">Camel Kafka Connector</span> <ul class="versions"> <li class="version"> <a href="../camel-kafka-connector/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../camel-kafka-connector/4.10.x/index.html">4.10.x</a> </li> </ul></li> <li class="component"><span class="title">Kamelet Catalog</span> <ul class="versions"> <li class="version"> <a href="../camel-kamelets/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../camel-kamelets/4.10.x/index.html">4.10.x (LTS)</a> </li> <li class="version"> <a href="../camel-kamelets/4.8.x/index.html">4.8.x (LTS)</a> </li> </ul></li> <li class="component"><span class="title">Camel Karaf</span> <ul class="versions"> <li class="version"> <a href="../camel-karaf/4.9.x/index.html">4.9.x</a> </li> <li class="version"> <a href="../camel-karaf/4.8.x/index.html">4.8.x</a> </li> <li class="version"> <a href="../camel-karaf/3.22.x/index.html">3.22.x (LTS)</a> </li> </ul></li> <li class="component"><span class="title">Camel Quarkus</span> <ul class="versions"> <li class="version"> <a href="../camel-quarkus/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../camel-quarkus/3.20.x/index.html">3.20.x</a> </li> <li class="version"> <a href="../camel-quarkus/3.15.x/index.html">3.15.x</a> </li> </ul></li> <li class="component"><span class="title">Camel Spring Boot</span> <ul class="versions"> <li class="version"> <a href="../camel-spring-boot/next/index.html">Next (Pre-release)</a> </li> <li class="version"> <a href="../camel-spring-boot/4.10.x/index.html">4.10.x (LTS)</a> </li> <li class="version"> <a href="../camel-spring-boot/4.8.x/index.html">4.8.x (LTS)</a> </li> <li class="version"> <a href="../camel-spring-boot/3.22.x/index.html">3.22.x (LTS)</a> </li> </ul></li> </ul> </div> </div> </aside> </div> <main class="article"> <nav class="toolbar" aria-label="Toolbar"> <button class="nav-toggle" type="button" aria-label="Toggle submenu"></button> <nav class="breadcrumbs" aria-label="breadcrumbs"> <ul> <li><a href="index.html">User manual</a></li> <li><a href="architecture.html">Architecture</a></li> <li><a href="oncompletion.html">OnCompletion</a></li> </ul> </nav> <div class="edit-this-page"><a href="https://github.com/apache/camel/edit/main/docs/user-manual/modules/ROOT/pages/oncompletion.adoc">Edit this Page</a></div> </nav> <div class="content"> <article class="doc"> <h1 class="page">OnCompletion</h1> <div id="preamble"> <div class="sectionbody"> <div class="paragraph"> <p>Camel has this concept of a <em>Unit of Work</em> that encompass the Exchange. The unit of work among others supports synchronization callbacks that are invoked when the Exchange is complete. The callback API is defined in <code>org.apache.camel.spi.Synchronization</code> and the extended synchronization <code>org.apache.camel.spi.SynchronizationRouteAware</code> that have callbacks for route events.</p> </div> </div> </div> <div class="sect1"> <h2 id="_unitofwork_api"><a class="anchor" href="#_unitofwork_api"></a>UnitOfWork API</h2> <div class="sectionbody"> <div class="paragraph"> <p>You can get hold of the <code>org.apache.camel.spi.UnitOfWork</code> from <code>org.apache.camel.Exchange</code> with the method <code>getUnitOfWork()</code>.</p> </div> </div> </div> <div class="sect1"> <h2 id="_oncompletion_dsl"><a class="anchor" href="#_oncompletion_dsl"></a>OnCompletion DSL</h2> <div class="sectionbody"> <div class="paragraph"> <p>The OnCompletion EIP supports the following features:</p> </div> <div class="ulist"> <ul> <li> <p>level: context or route (route level override global level)</p> </li> <li> <p>triggered either always, only if completed with success, or only if failed</p> </li> <li> <p><code>onWhen</code> predicate to only trigger if matched</p> </li> <li> <p><code>mode</code> to define whether to run either before or after route consumer writes response back to callee (if it is InOut) (default AfterConsumer)</p> </li> <li> <p><code>parallelProcessing</code> whether to run async or sync (use a thread pool or not) (default false)</p> </li> </ul> </div> <div class="paragraph"> <p>The onCompletion supports running the completion task in either synchronous or asynchronous mode (using a thread pool) and also whether to run before or after the route consumer is done. The reason is to give more flexibility. For example to specify to run synchronous and before the route consumer is done, which allows to modify the exchange before the consumer writes back any response to the callee. You can use this to for example add customer headers, or send to a log to log the response message, etc.</p> </div> <div class="sect2"> <h3 id="_oncompletion_with_route_scope"><a class="anchor" href="#_oncompletion_with_route_scope"></a>onCompletion with route scope</h3> <div class="paragraph"> <p>The OnCompletion EIP allows you to add custom routes/processors when the original Exchange is complete. Camel spins off a copy of the Exchange and routes it in a separate thread, similar to a Wire Tap. This allows the original thread to continue while the onCompletion route is running concurrently. We chose this model as we did not want the onCompletion route to interfere with the original route.</p> </div> </div> <div class="sect2"> <h3 id="_multiple_oncompletions"><a class="anchor" href="#_multiple_oncompletions"></a>Multiple onCompletions</h3> <div class="paragraph"> <p>You may define multiple onCompletions at both context and route level.</p> </div> <div class="paragraph"> <p>When you define route level onCompletions then any context levels are disabled for that given route.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:start") |
| .onCompletion() |
| // this route is only invoked when the original route is complete as a kind |
| // of completion callback |
| .to("log:sync") |
| .to("mock:sync") |
| // must use end to denote the end of the onCompletion route |
| .end() |
| // here the original route contiunes |
| .process(new MyProcessor()) |
| .to("mock:result");</code></pre> </div> </div> <div class="paragraph"> <p>By default the OnCompletion EIP will be triggered when the Exchange is complete and regardless if the Exchange completed with success or with a failure (such as an Exception was thrown). You can limit the trigger to only occur <code>onCompleteOnly</code> or by <code>onFailureOnly</code> as shown below:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:start") |
| // here we qualify onCompletion to only invoke when the exchange failed (exception or FAULT body) |
| .onCompletion().onFailureOnly() |
| .to("log:sync") |
| .to("mock:syncFail") |
| // must use end to denote the end of the onCompletion route |
| .end() |
| .onCompletion().onCompleteOnly() |
| .to("log:sync") |
| .to("mock:syncOK") |
| .end() |
| // here the original route continues |
| .process(new MyProcessor()) |
| .to("mock:result");</code></pre> </div> </div> <div class="paragraph"> <p>You can identify if the Exchange is an OnCompletion Exchange as Camel will add the property <code>Exchange.ON_COMPLETION</code> with a boolean value of <code>true</code>.</p> </div> </div> <div class="sect2"> <h3 id="_using_oncompletion_from_xml_dsl"><a class="anchor" href="#_using_oncompletion_from_xml_dsl"></a>Using onCompletion from XML DSL</h3> <div class="paragraph"> <p>The onCompletion is defined like this with XML DSL:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="direct:start"/> |
| <!-- this onCompletion block will only be executed when the exchange is done being routed --> |
| <!-- this callback is always triggered even if the exchange failed --> |
| <onCompletion> |
| <!-- so this is a kinda like an after completion callback --> |
| <to uri="log:sync"/> |
| <to uri="mock:sync"/> |
| </onCompletion> |
| <process ref="myProcessor"/> |
| <to uri="mock:result"/> |
| </route></code></pre> </div> </div> <div class="paragraph"> <p>And the <code>onCompleteOnly</code> and <code>onFailureOnly</code> is defined as a boolean attribute on the <code><onCompletion></code> tag, so the failure example would be:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route> |
| <from uri="direct:start"/> |
| <!-- this onCompletion block will only be executed when the exchange is done being routed --> |
| <!-- this callback is only triggered when the exchange failed, as we have onFailureOnly=true --> |
| <onCompletion onFailureOnly="true"> |
| <to uri="log:sync"/> |
| <to uri="mock:sync"/> |
| </onCompletion> |
| <process ref="myProcessor"/> |
| <to uri="mock:result"/> |
| </route></code></pre> </div> </div> </div> <div class="sect2"> <h3 id="_oncompletion_with_global_level"><a class="anchor" href="#_oncompletion_with_global_level"></a>onCompletion with global level</h3> <div class="paragraph"> <p>This works just like the route level except from the fact that they are defined globally. An example below:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">// define a global on completion that is invoked when the exchange is done being routed |
| onCompletion().to("log:global").to("mock:sync"); |
| |
| from("direct:start") |
| .process(new MyProcessor()) |
| .to("mock:result");</code></pre> </div> </div> <div class="paragraph"> <p>And in XML:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><!-- this is a global onCompletion route that is invoked when any exchange is done being routed |
| as a kind of after callback --> |
| <onCompletion> |
| <to uri="log:global"/> |
| <to uri="mock:sync"/> |
| </onCompletion> |
| |
| <route> |
| <from uri="direct:start"/> |
| <process ref="myProcessor"/> |
| <to uri="mock:result"/> |
| </route></code></pre> </div> </div> <div class="admonitionblock important"> <div class="table-wrapper"><table> <tr> <td class="icon"> <i class="fa icon-important" title="Important"></i> </td> <td class="content"> If an <code>onCompletion</code> is defined in a route, it overrides <strong>all</strong> global scoped, and thus it is only the route scoped that is used. The globally scoped are not in use. </td> </tr> </table></div> </div> </div> <div class="sect2"> <h3 id="_using_oncompletion_with_onwhen_predicate"><a class="anchor" href="#_using_oncompletion_with_onwhen_predicate"></a>Using onCompletion with onWhen predicate</h3> <div class="paragraph"> <p>As other DSL in Camel you can attach a predicate to the <code>onCompletion</code>, so it only triggers in certain conditions, when the predicate matches. For example to only trigger if the message body contains the word <em>Hello</em> we can do like:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:start") |
| .onCompletion().onWhen(body().contains("Hello")) |
| // this route is only invoked when the original route is done being routed |
| // and the onWhen predicate is true |
| .to("log:sync") |
| .to("mock:sync") |
| // must use end to denote the end of the onCompletion route |
| .end() |
| // here the original route continues |
| .to("log:original") |
| .to("mock:result");</code></pre> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_using_oncompletion_with_or_without_thread_pool"><a class="anchor" href="#_using_oncompletion_with_or_without_thread_pool"></a>Using onCompletion with or without thread pool</h2> <div class="sectionbody"> <div class="paragraph"> <p>To use a thread pool then either set a <code>executorService</code> or set <code>parallelProcessing</code> to true.</p> </div> <div class="paragraph"> <p>For example in Java DSL do</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">onCompletion().parallelProcessing() |
| .to("mock:before") |
| .delay(1000) |
| .setBody(simple("OnComplete:${body}"));</code></pre> </div> </div> <div class="paragraph"> <p>And in XML DSL:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><onCompletion parallelProcessing="true"> |
| <to uri="mock:before"/> |
| <delay><constant>1000</constant></delay> |
| <setBody><simple>OnComplete:${body}</simple></setBody> |
| </onCompletion></code></pre> </div> </div> <div class="paragraph"> <p>You can also refer to a specific thread pool to be used, using the <code>executorServiceRef</code> option</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><onCompletion executorServiceRef="myThreadPool"> |
| <to uri="mock:before"/> |
| <delay><constant>1000</constant></delay> |
| <setBody><simple>OnComplete:${body}</simple></setBody> |
| </onCompletion></code></pre> </div> </div> <div class="sect2"> <h3 id="_oncompletion_consumer_modes"><a class="anchor" href="#_oncompletion_consumer_modes"></a>OnCompletion consumer modes</h3> <div class="paragraph"> <p>OnCompletion supports two modes that affect the route consumer:</p> </div> <div class="ulist"> <ul> <li> <p>AfterConsumer - Default mode which runs after the consumer is done</p> </li> <li> <p>BeforeConsumer - Runs before the consumer is done, and before the consumer writes back response to the callee</p> </li> </ul> </div> <div class="paragraph"> <p>The AfterConsumer mode is the default mode which is the same behavior as in older Camel releases.</p> </div> <div class="paragraph"> <p>The new BeforeConsumer mode is used to run <code>onCompletion</code> before the consumer writes its response back to the callee (if in InOut mode). This allows the <code>onCompletion</code> to modify the Exchange, such as adding special headers, or to log the Exchange as a response logger etc.</p> </div> <div class="paragraph"> <p>For example to always add a "created by" header you use <code>modeBeforeConsumer()</code> as shown below:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">.onCompletion().modeBeforeConsumer() |
| .setHeader("createdBy", constant("Someone")) |
| .end()</code></pre> </div> </div> <div class="paragraph"> <p>And in XML DSL you set the mode attribute to BeforeConsumer:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><onCompletion mode="BeforeConsumer"> |
| <setHeader name="createdBy"> |
| <constant>Someone</constant> |
| </setHeader> |
| </onCompletion></code></pre> </div> </div> </div> </div> </div> </article> <aside class="toc sidebar" aria-label="Table of contents" data-title="Contents" data-levels="2"> <div class="toc-menu"></div> </aside> </div> </main> </div> <div class="footer-tools"> <a href="#top" title="Reach the top of the page">Back to top</a> </div> <footer> <div class="footer"> <figure class="logo"> <img src="../_/img/logo-d-a567cee6fa.svg" class="logo-small mt-60" alt="Apache Camel Logo" aria-label="white silhouette of a camel in front of a sand dune"> </figure> <input id="footer-toggle-overview" type="checkbox" title="Show/Hide Overview section"> <dl> <dt><label for="footer-toggle-overview">Overview</label><label for="footer-toggle-overview">+</label></dt> <dd><a href="../blog/">Blog</a></dd> <dd><a href="../docs/">Documentation</a></dd> <dd><a href="../community/support/">Community</a></dd> <dd><a href="../download/">Download</a></dd> </dl> <input id="footer-toggle-documentation" type="checkbox" title="Show/Hide Documentation section"> <dl> <dt><label for="footer-toggle-documentation">Documentation</label><label for="footer-toggle-documentation">+</label></dt> <dd><a href="../manual/">User Manual</a></dd> <dd><a href="../components/next/index.html">Components</a></dd> <dd><a href="../camel-k/next/">Camel-K</a></dd> <dd><a href="../camel-kafka-connector/next/">Camel Kafka Connector</a></dd> <dd><a href="../camel-quarkus/next/">Camel Quarkus</a></dd> <dd><a href="../camel-spring-boot/next/">Camel Spring Boot</a></dd> <dd><a href="../camel-karaf/3.22.x/">Camel Karaf</a></dd> <dd><a href="../manual/faq/index.html">FAQ</a></dd> </dl> <input id="footer-toggle-community" type="checkbox" title="Show/Hide Community section"> <dl> <dt><label for="footer-toggle-community">Community</label><label for="footer-toggle-community">+</label></dt> <dd><a href="../community/support/">Support</a></dd> <dd><a href="../community/contributing/">Contributing</a></dd> <dd><a href="../community/mailing-list/">Mailing Lists</a></dd> <dd><a href="../community/user-stories/">User stories</a></dd> <dd><a href="../community/articles/">Articles</a></dd> <dd><a href="../community/books/">Books</a></dd> <dd><a href="../community/team/">Team</a></dd> </dl> <input id="footer-toggle-about" type="checkbox" title="Show/Hide Acknowledgements section"> <dl> <dt><label for="footer-toggle-about">About</label><label for="footer-toggle-about">+</label></dt> <dd><a href="../acknowledgments/">Acknowledgments</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/events/current-event.html" title="Apache Events">Apache Events</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/licenses/" title="License">License</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/security/" title="Security">Security</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/foundation/sponsorship.html" title="Sponsorship">Sponsorship</a></dd> <dd><a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/foundation/thanks.html" title="Thanks">Thanks</a></dd> </dl> <p class="remark"> © 2004-2025 The <a href="https://apache.org">Apache Software Foundation</a>.<br> Apache Camel, Camel, Apache, the Apache feather logo, and the Apache Camel project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. </p> <div class="resources"> <div class="context"> <a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a> </div> <div class="context"> <a target="_blank" rel="noopener noreferrer nofollow" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a> </div> <div class="context"> <a href="../sitemap/">Sitemap</a> </div> </div> <div class="footer-icons"> <a rel="noopener noreferrer nofollow" href="https://github.com/apache/camel/" title="Collaborate on GitHub"><svg class="brand-icon" focusable="false"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#github"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://camel.zulipchat.com" title="Chat on Zulip"><svg class="brand-icon" focusable="false"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#zulip"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://twitter.com/ApacheCamel" title="Follow Apache Camel on Twitter"><svg class="brand-icon" focusable="false"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#twitter"/></svg></a> <a rel="noopener noreferrer nofollow" href="https://www.linkedin.com/groups/2447439/" title="Apache Camel group on Linkedin"><svg class="brand-icon" focusable="false"><use xlink:href="../_/img/brand-logos-f2e689f4d4.svg#linkedin"/></svg></a> </div> </div> </footer> <script src="../_/js/vendor/algoliasearch-bad45193e2.js"></script> <script src="../_/js/site-c215fb6972.js"></script> <script async src="../_/js/vendor/highlight-621a10fe1b.js"></script> <script async src="../_/js/vendor/svg4everybody-a0c573f2b9.js"></script> <script async src="../_/js/vendor/tabs-5aea11bcf5.js" data-sync-storage-key="preferred-tab"></script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "Organization", "name": "Apache Camel", "url": "https://camel.apache.org", "sameAs": [ "https://twitter.com/ApacheCamel" ], "logo": "../_/img/logo-d-a567cee6fa.svg", "description": "Apache Camel ™ is a versatile open-source integration framework based on known Enterprise Integration Patterns. Camel empowers you to define routing and mediation rules in a variety of domain-specific languages, including a Java-based Fluent API, Spring or Blueprint XML Configuration files, and a Scala DSL." } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Apache Camel", "item": "https://camel.apache.org/" }, { "@type": "ListItem", "position": 2, "name": "User manual", "item": "https://camel.apache.org/manual/index.html" }, { "@type": "ListItem", "position": 3, "name": "default", "item": "https://camel.apache.org/manual/index.html" }, { "@type": "ListItem", "position": 4, "name": "Architecture", "item": "https://camel.apache.org/manual/architecture.html" }, { "@type": "ListItem", "position": 5, "name": "OnCompletion", "item": "https://camel.apache.org/manual/oncompletion.html" }] } </script> </body> </html> |