This is the second tutorial about JBang. In the first one we covered the basics of this powerful scripting toolkit: Java scripting with JBang . We will now learn how to install Apps from its rich catalog and how to run scripts on the top of Apps.
JBang comes with ability to setup jbang to put scripts/apps into your PATH
using jbang app
. This is useful to easily make scripts available from anywhere on any Operating System.
As a proof of concept, let’s see how we can run a Kamelet application to produce and consume messages from an Apache Kafka cluster using JBang.
Firstly, make sure that JBang is installed:
curl -Ls https://sh.jbang.dev | bash -s - app setup
Now let’s check the Apps Store: https://www.jbang.dev/appstore/
This is a front-end for all Apps available in the Catalog. To install an App, you can use the following CLI syntax:
jbang app install <app-name>
Therefore, to install the app named “CamelJBang“, we need to run the following command from your terminal:
jbang app install [email protected]/camel
Next, we will verify that the Apps that are available on your machine:
$ jbang app list CamelJBang jbang quarkus
As you can see, CamelJBang alias has been added to the Apps I have on my machine.
Running the CamelJBangApp
To use our CamelJBangApp, let’s run the helper tool:
$ CamelJBang --help [jbang] Building jar... Usage: CamelJBang [-hV] [COMMAND] A JBang-based Camel app for running Kamelets -h, --help Show this help message and exit. -V, --version Print version information and exit. Commands: run Run a Kamelet search Search for kameletes, components and patterns (use --help) init Provide init templates for kamelets and bindings
So, there are three commands you can use along with your App: run will launch a Kamelet, search will let you search for Kamelets and Components in the Catalogue. Finally, init will help you to create a minimal configuration for Kamelets.
We will now run the following Kamelets which are available in the example repository:
Here is kafka-unsecured-source.yaml
- route: from: uri: "kamelet:kafka-not-secured-source" parameters: brokers: localhost:9092 topic: test-topic steps: - log: "${body}"
Here is the kafka-unsecured-sink.yaml
- route: from: uri: "kamelet:timer-source" parameters: period: 12399 message: "Hello Kafka from Camel JBang" steps: - log: "${body}" - to: uri: "kamelet:kafka-not-secured-sink" parameters: brokers: localhost:9092 topic: test-topic
Before firing our Kamelets, we need to start a Kafka Server. For this purpose, create a docker-compose.yaml file which contains a reference to Zookeeper and Apache Kafka from Strimzi project:
version: '2' services: zookeeper: image: strimzi/kafka:0.17.0-kafka-2.4.0 command: [ "sh", "-c", "bin/zookeeper-server-start.sh config/zookeeper.properties" ] ports: - "2181:2181" environment: LOG_DIR: /tmp/logs kafka: image: strimzi/kafka:0.17.0-kafka-2.4.0 command: [ "sh", "-c", "bin/kafka-server-start.sh config/server.properties --override listeners=$${KAFKA_LISTENERS} --override advertised.listeners=$${KAFKA_ADVERTISED_LISTENERS} --override zookeeper.connect=$${KAFKA_ZOOKEEPER_CONNECT}" ] depends_on: - zookeeper ports: - "9092:9092" environment: LOG_DIR: "/tmp/logs" KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
Start Apache Kafka as follows:
docker-compose up
We are now ready to start our Kamelets. Here is the Kafka sink:
CamelJBang run kafka-unsecured-sink.yaml
And then the Source Producer:
CamelJBang run kafka-unsecured-source.yaml
The Camel Producer will connect to Apache Kafka cluster and, using a Timer source, starts sending messages to test-topic:
13:03:04.728 [kafka-producer-network-thread | producer-1] INFO org.apache.kafka.clients.Metadata - [Producer clientId=producer-1] Cluster ID: dCddr9VrR5CEilSKO6svfw 13:03:05.467 [Camel (CamelJBang) thread #2 - timer://tick] INFO route2 - Hello Kafka from Camel JBang
The Consumer receives the message from the test-topic:
13:02:56.948 [Camel (CamelJBang) thread #2 - KafkaConsumer[test-topic]] INFO org.apache.kafka.clients.consumer.internals.SubscriptionState - [Consumer clientId=consumer-567d7268-b0e4-473c-8a48-43c660cf7c7d-2, groupId=567d7268-b0e4-473c-8a48-43c660cf7c7d] Resetting offset for partition test-topic-0 to position FetchPosition{offset=0, offsetEpoch=Optional.empty, currentLeader=LeaderAndEpoch{leader=Optional[localhost:9092 (id: 0 rack: null)], epoch=0}}. 13:03:05.580 [Camel (CamelJBang) thread #2 - KafkaConsumer[test-topic]] INFO route2 - Hello Kafka from Camel JBang

Conclusion
We have just had a brief overview of the JBang universe which already features a large set of apps which can help you to script Java applications even faster.