blob: e334e2229fee65450721e52b1d5f59e43727e0a0 [file] [log] [blame]
= File consumer with Bindy & FTP: A Camel Quarkus example
:cq-example-description: An example that shows how to consume CSV files, marshal & unmarshal the data and send it onwards via FTP
{cq-description}
TIP: Check the https://camel.apache.org/camel-quarkus/latest/first-steps.html[Camel Quarkus User guide] for prerequisites
and other general information.
== Prerequisites
The example application requires a running FTP server. For simplicity, you can start one with Docker.
[source,shell]
----
docker run -ti --rm -p 2222:2222 \
-e PASSWORD_ACCESS=true \
-e USER_NAME=ftpuser \
-e USER_PASSWORD=ftppassword \
-e DOCKER_MODS=linuxserver/mods:openssh-server-openssh-client \
linuxserver/openssh-server
----
If you prefer to use a different server, then the properties prefixed with `ftp.` in `src/main/resources/application.properties` can be adjusted for this purpose.
== Start in Development mode
Ensure the aforementioned FTP server is running and do the following to run the application in development mode.
[source,shell]
----
$ mvn clean compile quarkus:dev
----
The above command compiles the project, starts the application and lets the Quarkus tooling watch for changes in your
workspace. Any modifications in your project will automatically take effect in the running application.
TIP: Please refer to the Development mode section of
https://camel.apache.org/camel-quarkus/latest/first-steps.html#_development_mode[Camel Quarkus User guide] for more details.
You should start to see some log messages appearing on the console.
Every 10 seconds the timer component triggers the generation of some random 'books' data and creates a CSV file in a temporary directory with 100 entries.
[source,shell]
----
[route1] (Camel (camel-1) thread #3 - timer://generateBooks) Generating randomized books CSV data
----
Next the CSV file is read by a file consumer and Bindy is used to marshal the individual data rows into `Book` objects.
[source,shell]
----
[route2] (Camel (camel-1) thread #1 - file:///tmp/books) Reading books CSV data from 89A0EE24CB03A69-0000000000000000
----
Next the collection of `Book` objects is split into individual items and is aggregated based on the `genre` property.
[source,shell]
----
[route3] (Camel (camel-1) thread #0 - AggregateTimeoutChecker) Processed 34 books for genre 'Action'
[route3] (Camel (camel-1) thread #0 - AggregateTimeoutChecker) Processed 31 books for genre 'Crime'
[route3] (Camel (camel-1) thread #0 - AggregateTimeoutChecker) Processed 35 books for genre 'Horror'
----
Finally, the aggregated book collections are unmarshalled back to CSV format and uploaded to the test FTP server.
[source,shell]
----
[route4] (Camel (camel-1) thread #2 - seda://processed) Uploaded books-Action-89A0EE24CB03A69-0000000000000069.csv
[route4] (Camel (camel-1) thread #2 - seda://processed) Uploaded books-Crime-89A0EE24CB03A69-0000000000000069.csv
[route4] (Camel (camel-1) thread #2 - seda://processed) Uploaded books-Horror-89A0EE24CB03A69-0000000000000069.csv
----
=== Package and run the application
Once you are done with developing you may want to package and run the application.
TIP: Find more details about the JVM mode and Native mode in the Package and run section of
https://camel.apache.org/camel-quarkus/latest/first-steps.html#_package_and_run_the_application[Camel Quarkus User guide]
==== JVM mode
[source,shell]
----
$ mvn clean package
$ java -jar target/quarkus-app/quarkus-run.jar
----
==== Native mode
IMPORTANT: Native mode requires having GraalVM and other tools installed. Please check the Prerequisites section
of https://camel.apache.org/camel-quarkus/latest/first-steps.html#_prerequisites[Camel Quarkus User guide].
To prepare a native executable using GraalVM, run the following command:
[source,shell]
----
$ mvn clean package -Pnative
$ ./target/*-runner
----
==== Deploying to Kubernetes
You can build a container image for the application like this. Refer to the https://quarkus.io/guides/deploying-to-kubernetes[Quarkus Kubernetes guide] for options around customizing image names, registries etc.
[source,shell]
----
$ mvn clean package -DskipTests -Dquarkus.container-image.build=true
----
If you are using a local development cluster like Kind or k3s, you can use host the container image on your local host. Or, with minikube, use the Docker daemon from the cluster virtual machine `eval $(minikube docker-env)`. Otherwise, you'll need to push the image to a registry of your choosing.
Next apply the necessary resources to the cluster.
[source,shell]
----
$ kubectl apply -f target/kubernetes/kubernetes.yml
secret/ftp-credentials created
service/camel-quarkus-examples-file-bindy-ftp created
service/ftp-server created
deployment.apps/camel-quarkus-examples-file-bindy-ftp created
deployment.apps/ssh-server-deployment created
----
TIP: You can build & deploy in one single step by doing `mvn clean package -DskipTests -Dquarkus.kubernetes.deploy=true`
Check pods are running.
[source,shell]
----
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
camel-quarkus-examples-file-bindy-ftp-5d48f4d85c-sjl8k 1/1 Running 0 21s
ssh-server-deployment-5c667bccfc-52xfz 1/1 Running 0 21s
----
Tail the application logs.
[source,shell]
----
$ kubectl logs -f camel-quarkus-examples-file-bindy-ftp-5d48f4d85c-sjl8k
----
To clean up do.
[source,shell]
----
$ kubectl delete all -l app.kubernetes.io/name=camel-quarkus-examples-file-bindy-ftp
----
==== Deploying to OpenShift
To start a Source To Image (S2I) build and deploy the application.
[source,shell]
----
$ mvn clean package -DskipTests -Dquarkus.kubernetes.deploy=true -Dopenshift
----
You can check the pod status and tail logs using the commands mentioned above in the Kubernetes section. Use the `oc` binary instead of `kubectl` if preferred.
== Feedback
Please report bugs and propose improvements via https://github.com/apache/camel-quarkus/issues[GitHub issues of Camel Quarkus] project.