blob: 3fdad3ad9531c570a04f0ebddae01db5ec02aeda [file] [log] [blame]
= Defining Camel routes
Camel Quarkus supports several domain specific languages (DSLs) to define Camel Routes.
== Java DSL
Extending `org.apache.camel.builder.RouteBuilder` and using the fluent builder methods available there
is the most common way of defining Camel Routes.
Here is an example from the https://github.com/apache/camel-quarkus-examples/tree/main/timer-log[timer-log] quickstart:
[source,java]
----
import org.apache.camel.builder.RouteBuilder;
public class TimerRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("timer:foo?period=1000")
.log("Hello World");
}
}
----
=== Endpoint DSL
Since Camel 3.0, you can use fluent builders also for defining Camel endpoints.
The following is equivalent with the previous example:
[source,java]
----
import org.apache.camel.builder.RouteBuilder;
import static org.apache.camel.builder.endpoint.StaticEndpointBuilders.timer;
public class TimerRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from(timer("foo").period(1000))
.log("Hello World");
}
}
----
[NOTE]
====
Builder methods for all Camel components are available via `camel-quarkus-core`,
but you still need to add the given component's extension as a dependency for the route to work properly.
In case of the above example, it would be `camel-quarkus-timer`.
====
== XML DSL
In order to configure Camel routes, rests or templates in XML, you must add a Camel XML parser dependency to the classpath.
Since Camel Quarkus 1.8.0, `xref:reference/extensions/xml-io-dsl.adoc[camel-quarkus-xml-io-dsl]` is the best choice.
With Camel Main, you can set a property that points to the location of resources XML files such as routes, xref:manual::rest-dsl.adoc[REST DSL] and xref:manual::route-template.adoc[Route templates]:
[source,properties]
----
camel.main.routes-include-pattern = routes/routes.xml, file:src/main/routes/rests.xml, file:src/main/rests/route-template.xml
----
[NOTE]
====
Path globbing like `camel.main.routes-include-pattern = *./routes.xml` currently does not work in native mode.
====
.Route
[source,xml]
----
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<route id="xml-route">
<from uri="timer:from-xml?period=1000"/>
<log message="Hello XML!"/>
</route>
</routes>
----
[WARNING]
====
When using XML routes with beans, it is sometime needed to refer to class name, for instance `beanType=org.apache.SomeClass`.
In such cases, it might be needed to register the class for reflection in native mode.
Refer to the xref:user-guide/native-mode.adoc#reflection[Native mode] user guide for more information.
====
[WARNING]
====
Spring XML with `<beans>` or Blueprint XML with `<blueprint>` elements are not supported.
====
The route XML should be in the simplified version like:
.Rest DSL
[source,xml]
----
<rests xmlns="http://camel.apache.org/schema/spring">
<rest id="greeting" path="/greeting">
<get path="/hello">
<to uri="direct:greet"/>
</get>
</rest>
</rests>
----
.Route Templates
[source,xml]
----
<routeTemplates xmlns="http://camel.apache.org/schema/spring">
<routeTemplate id="myTemplate">
<templateParameter name="name"/>
<templateParameter name="greeting"/>
<templateParameter name="myPeriod" defaultValue="3s"/>
<route>
<from uri="timer:{{name}}?period={{myPeriod}}"/>
<setBody><simple>{{greeting}} ${body}</simple></setBody>
<log message="${body}"/>
</route>
</routeTemplate>
</routeTemplates>
----
== YAML DSL
To configure routes with YAML, you must add the `camel-quarkus-yaml-dsl` dependency to the classpath.
With Camel Main, you can set a property that points to the location of YAML files containing routes, xref:manual::rest-dsl.adoc[REST DSL] and xref:manual::route-template.adoc[Route templates] definitions:
[source,properties]
----
camel.main.routes-include-pattern = routes/routes.yaml, routes/rests.yaml, rests/route-template.yaml
----
.Route
[source,yaml]
----
- route:
id: "my-yaml-route"
from:
uri: "timer:from-yaml?period=1000"
steps:
- set-body:
constant: "Hello YAML!"
- to: "log:from-yaml"
----
.Rest DSL
[source,yaml]
----
- rest:
get:
- path: "/greeting"
to: "direct:greet"
- route:
id: "rest-route"
from:
uri: "direct:greet"
steps:
- set-body:
constant: "Hello YAML!"
----
.Route Templates
[source,yaml]
----
- route-template:
id: "myTemplate"
parameters:
- name: "name"
- name: "greeting"
defaultValue: "Hello"
- name: "myPeriod"
defaultValue: "3s"
from:
uri: "timer:{{name}}?period={{myPeriod}}"
steps:
- set-body:
expression:
simple: "{{greeting}} ${body}"
- log: "${body}"
- templated-route:
route-template-ref: "myTemplate"
parameters:
- name: "name"
value: "tick"
- name: "greeting"
value: "Bonjour"
- name: "myPeriod"
value: "5s"
----
== Other route DSLs
* xref:reference/extensions/java-joor-dsl.adoc[Java jOOR]
* xref:reference/extensions/groovy-dsl.adoc[Groovy]
* xref:reference/extensions/yaml-dsl.adoc[YAML]
* xref:reference/extensions/kotlin-dsl.adoc[Kotlin]
* xref:reference/extensions/js-dsl.adoc[JavaScript]
== What's next?
We recommend to continue with xref:user-guide/configuration.adoc[Configuration].