blob: 42f0557600111b783256e632aadfafc820d3acd6 [file] [log] [blame]
[[languages]]
= Languages
Camel K supports integration written in the following languages:name: value
[options="header"]
|=======================
| Language | Description
| Java | Both integrations in source `.java` files or compiled `.class` file can be run.
| XML | Integrations written in plain XML DSL are supported (Spring XML or Blueprint not supported).
| Groovy | Groovy `.groovy` files are supported (experimental).
| JavaScript | JavaScript `.js` files are supported (experimental).
| Kotlin | Kotlin Script `.kts` files are supported (experimental).
|=======================
[WARNING]
====
Work In Progress
====
=== Java
Using Java to write an integration to be deployed using camel-k is not different from defining your routing rules in Camel with the only difference that you do not need to build and package it as a jar.
[source,java]
.Example
----
import org.apache.camel.builder.RouteBuilder;
public class Sample extends RouteBuilder {
@Override
public void configure() throws Exception {
from("timer:tick")
.setBody()
.constant("Hello Camel K!")
.to("log:info");
}
}
----
=== XML
Camel K support the standard Camel Routes XML DSL:
[source,xml]
.Example
----
<routes xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="timer:tick"/>
<setBody>
<constant>Hello Camel K!</constant>
</setBody>
<to uri="log:info"/>
</route>
</routes>
----
=== Groovy
An integration written in Groovy looks very similar to a Java one except it can leverages Groovy's language enhancements over Java:
[source,java]
----
from('timer:tick')
.process { it.in.body = 'Hello Camel K!' }
.to('log:info')
----
Camel K extends the Camel Java DSL making it easier to configure the context in which the integration runs using the top level _context_ block
[source,java]
----
context {
// configure the context here
}
----
At the moment the enhanced DSL provides a way to bind items to the registry, to configure the components the context creates and some improvements over the REST DSL.
- *Registry*
+
The registry is accessible using the _registry_ block inside the _context_ one:
+
[source,java]
----
context {
registry {
bind "my-cache", Caffeine.newBuilder().build() // <1>
bind "my-processor", processor { // <2>
it.in.body = 'Hello Camel K!'
}
bind "my-predicate", predicate { // <3>
it.in.body != null
}
}
}
----
<1> bind a bean to the context
<2> define a custom processor to be used later in the routes by ref
<2> define a custom predicate to be used later in the routes by ref
- *Components*
+
Components can be configured within the _components_ block inside the _context_ one:
+
[source,java]
----
context {
components {
'seda' { // <1>
queueSize = 1234
concurrentConsumers = 12
}
'log' { // <2>
exchangeFormatter = {
'body ==> ' + it.in.body
} as org.apache.camel.spi.ExchangeFormatter
}
}
}
----
<1> configure the properties of the component whit name _seda_
<2> configure the properties of the component whit name _log_
+
Setting the property _exchangeFormatter_ looks a little ugly as you have to declare the type of your closure. For demonstration purpose we have created a Groovy extension module that simplify configuring the _exchangeFormatter_ so you can rewrite your DSL as
+
[source,java]
----
context {
components {
...
'log' {
formatter {
'body ==> ' + it.in.body
}
}
}
}
----
+
which is much better.
+
[TIP]
====
You can provide your custom extensions by packaging them in a dependency you declare for your integration.
====
- *Rest*
+
Integrations's REST endpoints can be configured using the top level _rest_ block:
+
[source,java]
----
rest {
configuration { // <1>
host = 'my-host'
port '9192'
}
path('/my/path') { // <2>
// standard Rest DSL
}
}
----
<1> Configure the rest engine
<2> Configure the rest endpoint for the base path '/my/path'
=== Kotlin
An integration written in Kotlin looks very similar to a Java one except it can leverages Kotlin's language enhancements over Java:
[source,java]
----
from('timer:tick')
.process { e -> e.getIn().body = 'Hello Camel K!' }
.to('log:info');
----
Camel K extends the Camel Java DSL making it easier to configure the context in which the integration runs using the top level _context_ block
[source,java]
----
context {
// configure the context here
}
----
At the moment the enhanced DSL provides a way to bind items to the registry, to configure the components the context creates and some improvements over the REST DSL.
- *Registry*
+
The registry is accessible using the _registry_ block inside the _context_ one:
+
[source,java]
----
context {
registry {
bind("my-cache", Caffeine.newBuilder().build()) // <1>
bind("my-processor", processor { // <2>
e -> e.getIn().body = "Hello"
})
bind("my-predicate", predicate { // <2>
e -> e.getIn().body != null
})
}
}
----
<1> bind a simple bean to the context
<2> define a custom processor to be used later in the routes by ref
<2> define a custom predicate to be used later in the routes by ref
- *Components*
+
Components can be configured within the _components_ block inside the _context_ one:
+
[source,java]
----
context {
components {
component<SedaComponent>("seda") { //<1>
queueSize = 1234
concurrentConsumers = 12
}
component<SedaComponent>("mySeda") { // <2>
queueSize = 4321
concurrentConsumers = 21
}
component<LogComponent>("log") { // <3>
setExchangeFormatter {
e: Exchange -> "" + e.getIn().body
}
}
}
}
----
<1> configure the properties of a component whit type _SedaComponent_ and name _seda_
<2> configure the properties of a component with type SedaComponent and name _mySeda_, note that as _mySeda_ does not represent a valid component scheme, a new component of the required type will be instantiated.
<3> configure the properties of the component whit name _log_
+
[NOTE]
====
As for Groovy, you can provide your custom extension to the DSL
====
- *Rest*
+
Integrations's REST endpoints can be configured using the top level _rest_ block:
+
[source,java]
----
rest {
configuration {
host = "my-host"
port = "9192"
}
path("/my/path") { // <2>
// standard Rest DSL
}
}
----
<1> Configure the rest engine
<2> Configure the rest endpoint for the base path '/my/path'
=== JavaScript
The integration written in JavaScript looks very similar to a Java one:
[source,js]
----
function proc(e) {
e.getIn().setBody('Hello Camel K!')
}
from('timer:tick')
.process(proc)
.to('log:info')
----
For JavaScript integrations, Camel K does not yet provide an enhanced DSL but you can access to some global bounded objects such as a writable registry and the camel context so to set the property _exchangeFormatter_ of the _LogComponent_ as done in previous example, you can do something like:
[source,js]
----
l = context.getComponent('log', true, false)
l.exchangeFormatter = function(e) {
return "log - body=" + e.in.body + ", headers=" + e.in.headers
}
----