Camel JBang
A JBang-based Camel app for easily running Camel routes.
The camel-jbang
is available from Camel 3.12 and newer versions.
Installation
It is not necessary to install Camel JBang. However, if you prefer to do so, JBang makes it easy for us by providing an installation feature that works with Github. If you have JBang installed on your system, then you can run the following command to install CamelJBang:
jbang app install CamelJBang@apache/camel
Using Camel JBang
The CamelJBang supports multiple commands. Running the command below, will print all of them:
jbang CamelJBang@apache/camel [command]
Note: the first time you run this command, it may cause dependencies to be cached, therefore taking a few extra seconds to run.
All the commands support the --help
and will display the appropriate help if that flag is provided.
Troubleshooting
When using JBang then JBang stores state in ~/.jbang
directory.
This is also the location where JBang stores downloaded JARs.
So if you find problems with JBang using what is seems like an outdated JAR, then you can try to delete this directory, or parts of it.
Running Routes
You can run Camel routes from any of the supported DSLs in Camel such as YAML, XML, Java, Groovy.
For example to run YAML-based routes which also refer to Kamelets in the catalog.
In order to do so, write a YAML-based file with the route
, the steps
and the to
destination for the route. The following example, shows a route that uses the Timer Source Kamelet to produce messages every second. The body of the messages will be logged to the standard output. Subsequently, they will be sent to a AMQP 1.0 compliant broker using the JMS AMQ 1.0 Sink Kamelet.
- route:
id: "hello"
from:
uri: "kamelet:timer-source"
parameters:
period: 1000
message: "Hello Camel JBang"
steps:
- log: "${body}"
- to:
uri: "kamelet:jms-amqp-10-sink"
parameters:
remoteURI: amqp://localhost:61616
destinationName: test-queue
Execute the following command to run this route:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run jms-amqp-10-sink-binding.yaml
it is necessary to have a AMQP 1.0 broker, such as Apache Artemis, running locally and listening on port 61616. Adjust the route accordingly if using a different address for the broker. |
Running Routes from multiple files
You can run more than 1 file, for example to run two YAML files you can do:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run one.yaml two.yaml
You can also mix different DSLs such as yaml and Java:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run one.yaml hello.java
You can also use wildcards (i.e. *
) to match multiple files, such as running all the yaml files:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run *.yaml
Or you can run all files starting with foo*
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run foo*
The run goal can also detect files that are properties .
|
Live reload
You can enable live reload of the route(s) when the source file is updated (saved),
using the --reload
options as shown:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run jms-amqp-10-sink-binding.yaml --reload
Then while the Camel application is running, you can update the YAML route and update when saving.
The live reload is meant for development purposes, and if you encounter problems with reloading such as JVM class loading issues, then you may need to restart the application. |
Running routes hosted on GitHub
You can run a route that is hosted on GitHub using Camels github resource loader.
For example to run one of the Camel K examples you can do:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run run github:apache:camel-k:examples/languages/routes.yaml
Running local Kamelets
You can also use Camel JBang to try local Kamelets, without the need to publish them on Github or package them in a jar.
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run --local-kamelet-dir=/path/to/local/kamelets earthquake.yaml
Running Camel K integrations or bindings
Camel also supports running Camel K integrations and binding files, which are in CRD format (Kubernetes Custom Resource Definitions).
For example a kamelet binding file named joke.yaml
:
apiVersion: camel.apache.org/v1alpha1
kind: KameletBinding
metadata:
name: joke
spec:
source:
ref:
kind: Kamelet
apiVersion: camel.apache.org/v1
name: chuck-norris-source
properties:
period: 2000
sink:
ref:
kind: Kamelet
apiVersion: camel.apache.org/v1
name: log-sink
properties:
show-headers: false
Can be run with CamelJBang:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run joke.yaml
Using platform-http component
When a route is started from platform-http
then CamelJBang will automatically include a VertX HTTP server
running on port 8080. For example the following route in a file named server.yaml
:
- from:
uri: "platform-http:/hello"
steps:
- set-body:
constant: "Hello World"
Can be run with
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel run server.yaml
And you can call the HTTP service with:
curl http://localhost:8080/hello
Hello World%
Debugging
You can debug both CamelJBang@apache/camel and your integration scripts by making use of the --debug
flag provided by JBang:
jbang --debug CamelJBang@apache/camel run /path/to/integration.java
[jbang] Building jar...
Listening for transport dt_socket at address: 4004
As you can see the default listening port is 4004 but can be configured as described in JBang Debugging.
Search
You can use the CLI to search for kamelets, components, languages and miscellaneous components (others). Running the following command will present a list of items that can be searched:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel search --help
For example, to search for kamelets named jms
, you can use:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel search kamelets --search-term=jms
To list all the kamelets, just run the command without any search term:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel search kamelets
The same behavior also works for all the other search commands. The table below lists all search commands available at the moment:
Command | Description |
---|---|
kamelets |
search for kamelets |
components |
search for components |
languages |
search for languages |
others |
search for miscellaneous components |
Init Kamelets
The init sub-command can be used to simplify creating Kamelets. Through this command, it is possible to create new Kamelets through pre-configured templates. It works in two steps: first it is necessary to bootstrap the Kamelet by creating a properties file with the parameters necessary to create the Kamelet. Once the properties file is correctly set, then it is possible to create a pre-filled Kamelet by processing that properties file.
To bootstrap the Kamelet run:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel init kamelet --bootstrap
This will create a sub-directory called work
in the current directory with a properties file named init-template.properties
inside it.
The keys of the properties file are commented with the details about what need to be filled in order to generate the Kamelet. If a value is missing, it will be ignored when generating the Kamelet and will need to be filled in manually later.
After you have filled the values, you can generate the Kamelet using:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel init kamelet --properties-path work/init-template.properties
Running this command will create a new file in the work
directory. The name of the generated file is determined by the kameletMetadataName
property in the properties file. As such, parsing the default properties file would generate a file named my-sample-sink.kamelet.yaml
in the directory.
After the file is generated, it may still need to require final adjustments, such as correctly setting the name, the icon and other requirements for official Kamelets. Please consult the Kamelet development documentation for updated details.
Init Bindings
The init sub-command can also be used to simplify creating Kamelets bindings. Through this command, it is possible to create new bindings through pre-configured templates. Use the --kamelet
option (you can list the available ones using the search command) to set the Kamelet to generate the binding for.
To execute this feature run:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel init binding --destination /path/to/destination/directory/ --kamelet sftp-source
This will create a new sample YAML binding file that can be modified and used in Camel K.
You can also generate bindings that can be run by CamelJBang or Camel Core, but setting the --project
option:
jbang -Dcamel.jbang.version=3.14.0 CamelJBang@apache/camel init binding --destination /path/to/destination/directory/ --kamelet sftp-source --project core