Apache Camel: routes in YAML, Java or XML, and the runtime choice that follows
Apache Camel is an open source integration framework with 350+ connectors. Write routes in Java, YAML, or XML. Run on Spring Boot, Quarkus, or standalone. Apache License 2.0.
At a glance
- What is it?
- Apache Camel is an integration framework built on Enterprise Integration Patterns, with 350+ connectors and three runtimes. The interesting decision is not whether to use it, but which runtime and which DSL you commit to.
- Who is it for?
- Adopt Camel if you have many heterogeneous endpoints (Kafka, JDBC, REST, cloud services) and want one routing model instead of hand-written glue per system. Do not adopt it for a single point-to-point call between two services, where a plain HTTP client and a scheduler are less machinery.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Java, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The problem Camel solves is endpoint sprawl, not messaging
Camel is aimed at teams that keep adding connections between systems and end up maintaining a folder of bespoke clients. The README frames it as an integration framework with 350+ connectors for databases, APIs, message brokers and cloud services, and the component list names Kafka, REST, JDBC, AWS, Azure, GCP and Salesforce. That is the shape of the problem: not one protocol, but a dozen, each with its own client library, retry semantics and failure behaviour. Camel's answer is to describe the movement of a message as a route and let the framework own the connection details. The audience is Java shops, because the primary language is Java, and the routes are written against Camel's API. It is also a reasonable fit for teams that want integration logic to be reviewable as configuration rather than as a service class, which is what the YAML DSL buys you. The project has been in production since 2007 according to the README, which matters less as a quality signal than as an indication that the API surface has had time to settle.
A route is a from, a sequence of steps, and a to
The mechanism is visible in the two equivalent examples the README gives. A YAML route declares from with a uri of kafka:incoming-orders, then steps: unmarshal with json, then to with a uri of sql:INSERT INTO orders. The Java version is the same three calls chained: from, unmarshal().json(), to("sql:..."). The URI scheme selects the component, and the rest of the URI is component-specific configuration. That is the whole architecture in miniature. Messages flow from a consumer endpoint through a processor chain to a producer endpoint, and the Enterprise Integration Patterns linked from the README (splitter, aggregator, content-based router, and the rest) are the vocabulary for the middle of that chain. The SQL example also shows how message data reaches the endpoint: the values are bound with :#${header.id} and :#${body}, so the route body and headers are the payload contract between components. This is why the DSL choice is mostly cosmetic. YAML, Java and XML produce the same route model, and the README explicitly presents the same route three ways so teams can pick what fits. The trade-off is real though: YAML is easier to review and to generate from a visual designer, while Java gives you the compiler, refactoring tools and the ability to write custom processors inline without a separate artifact.
Getting a route running, and what the CLI actually does
The fastest path in the README is two commands: camel init hello.yaml creates a route file, and camel run hello.yaml executes it. That is the Camel CLI, documented separately as camel-jbang, and it is positioned for running, developing, testing and tracing routes from the command line. For an existing Spring Boot application the README gives a Maven dependency instead: groupId org.apache.camel.springboot, artifactId camel-spring-boot-starter. Note that this is the runtime-specific starter, not a core artifact, which is the pattern across the project: you depend on the runtime integration plus the components you use. The README lists Camel Quarkus as the cloud-native option with fast startup, low memory and native compilation, and Camel CLI as the command-line option, with Camel K for Kubernetes, Camel Karaf for OSGi and Camel Kafka Connector for Kafka Connect listed as other runtimes. Two things the README does not give you: a version number for the starter, and the component artifact names for the connectors in the example. You will need the components page for those. The MCP server is a separate setup step, documented under camel-jbang-mcp, and it feeds the Camel catalog to assistants such as Claude Code, GitHub Copilot, Cursor and Gemini CLI.
The runtime decision is the decision that is hard to reverse
Choosing between Spring Boot, Quarkus and the CLI is not a stylistic preference, because each one changes how the application is packaged and started. The README describes Quarkus as offering native compilation and lower memory; Spring Boot is described only as Camel on Spring Boot with starters for the 350+ connectors. If your deployment is a container image with a JVM and memory is not the binding constraint, Spring Boot is the lower-friction path because it reuses whatever Spring configuration and observability you already run. If you need a native binary or a small footprint, Quarkus is the runtime that claims it, and that choice will influence which extensions and libraries are viable around the route. The CLI is a different category again: it is a development and operations tool, useful for tracing and for running a route file without a build, and the README does not present it as a production deployment target in the same way as the other two. Pick the runtime early. Migrating a route between them is not a rewrite of the route logic, but it is a rewrite of the surrounding build, configuration and packaging.
Where Camel is the wrong tool
The honest limitation is that Camel is a framework you adopt, not a library you call. A route file, a runtime starter and a component dependency are three moving parts before anything moves a byte. If your integration is one service calling another over HTTP on a schedule, Camel adds a routing engine, a component catalog and a DSL on top of something a small amount of plain code already does. The second constraint is component variance. The README says 350+ connectors, but a catalog that size cannot be uniform in quality or maintenance, and the documentation does not claim otherwise. Some components wrap mature clients, others wrap vendor APIs that change. You should read the specific component page before designing around it. Third, the multi-DSL story cuts both ways: a team that writes YAML routes and Java processors and XML legacy routes has three syntaxes to review, and the README's three-way example is a demonstration of flexibility, not a recommendation to mix them in one repository. Fourth, the README does not state a support policy or an LTS cadence for releases, so version alignment between Camel core, the runtime starter and each component is something you verify rather than assume.
Spring Integration and Kafka Connect are the comparisons that matter
For a Spring-based shop already using Spring Integration, the difference is where the routing model lives. Spring Integration expresses flows as channels and endpoints wired through the Spring context, so the integration graph is a Spring bean graph and the tooling is Spring tooling. Camel keeps an explicit route abstraction with URIs and EIP processors, and can run outside Spring entirely, including on Quarkus and via the CLI. That portability is the actual distinction. The other comparison is Camel Kafka Connector against plain Kafka Connect. Kafka Connect is scoped to moving data in and out of Kafka with connectors that run inside the Connect worker; Camel's Kafka Connector lets you reuse Camel routes as the transformation logic inside that model. If your problem is strictly Kafka-to-Kafka, Connect alone is the smaller system. If the Kafka topic is one hop in a longer path through a database and a REST API, the Camel route is the thing that spans the whole path. The README also points at Kaoto and Karavan as visual designers, which is a different kind of alternative: not a competing runtime, but a way to author the same routes without hand-writing YAML.
Licence, maintenance and what upgrading costs
The project is Apache License 2.0, stated in the README and in LICENSE.txt, and the repository is not archived with a last push of 2026-09-10. Apache-2.0 is a permissive licence with an explicit patent grant, which is the usual reason enterprises accept it without a legal review cycle. This is a description of the licence text, not legal advice; if you redistribute Camel inside a product, read the NOTICE and attribution requirements yourself. On maintenance, the material supports a few concrete observations. There are many runtime integrations to keep aligned (Spring Boot, Quarkus, CLI, K, Karaf, Kafka Connector), and the component catalog is large, so the practical upgrade cost is the cost of tracking the components you actually use, not the framework as a whole. The MCP server is one more artifact to keep current if you rely on it for assistant context. The README does not state a release cadence, a support window or a compatibility matrix, so pin your Camel version, pin the matching runtime starter, and check the component pages for the connectors in your routes before you upgrade rather than after.
Editorial conclusion
Adopt Camel if you have many heterogeneous endpoints (Kafka, JDBC, REST, cloud services) and want one routing model instead of hand-written glue per system. Do not adopt it for a single point-to-point call between two services, where a plain HTTP client and a scheduler are less machinery. Before committing, verify three things in your own environment: that the specific component you need exists in the catalog and is not one of the ones marked deprecated on the components page, that your chosen runtime's starter resolves the Camel version you expect, and whether you need native compilation, since that decides Quarkus versus Spring Boot rather than the other way round.
Community notes