Jynx is an asynchronous label image detector. It exposes an endpoint that receive any image, write in a storage, send to a processing queue using RabbitMQ and the consumer renders the image using Google Vision API.
The Jynx is my first project in Quarkus the Supersonic Subatomic Java Framework and the goal is improve my knowledge with this Framework.
If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ .
Quarkus
- FrameworkPostgreSQL
- DatabaseRabbitMQ
- Messaging ServerArchUnit
- Unit test your Java architectureGCP Vision
- Google Cloud Machine LearnGCP Storage
- Google Cloud StorageHibernate ORM with Panache
- Hibernate ORM is the de facto JPA implementationGitHub Actions
- Automate, customize, and execute your software development workflows (CI/CD)br
This project has one endpoint to register images, it writes that image in a storage, register the information in a database and send the identification in a messaging service to be async processed. This endpoint return an identification marked with processing status.
The async process will be started when the queue receives the message. The routine get the identification message to will recovery the information of database and recovery the image to will be process. The process send to label image detection service the image, and the response will be recorded in database and finally will notify the messaging service in other exchange.
The architecture used in this project was based on Clean Architecture
but more flexible with only one layer separated by packages.
Article about Clean Architecture by Guilherme Zarelli
To guarantee this architecture, the dependency ArchUnit
will be used.
ENV | Description | Default value |
---|---|---|
DATABASE_URL | Database URL | IN DEVELOP MODE |
DATABASE_USERNAME | Database username | IN DEVELOP MODE |
DATABASE_PASSWORD | Database Password | IN DEVELOP MODE |
RABBITMQ_HOST | RabbitMQ Host | IN DEVELOP MODE |
RABBITMQ_VHOST | RabbitMQ Vhost | IN DEVELOP MODE |
RABBITMQ_USERNAME | RabbitMQ username | IN DEVELOP MODE |
RABBITMQ_PASSWORD | RabbitMQ password | IN DEVELOP MODE |
GOOGLE_APPLICATION_CREDENTIALS | File of GCP Credentials | NO |
You can run the infrastructure needed for this project using the (docker-compose.yml
)[./docker-compose.yml]
docker-compose up -d
You can run your application in dev mode that enables live coding using:
./gradlew quarkusDev
Access Swagger UI:
http://localhost:8080/q/swagger-ui
See the request samples in this file: request-samples.html
The application can be packaged using ./gradlew quarkusBuild
.
It produces the jynx-1.0-SNAPSHOT-runner.jar
file in the build
directory.
Be aware that it’s not an über-jar as the dependencies are copied into the build/lib
directory.
The application is now runnable using java -jar build/jynx-1.0-SNAPSHOT-runner.jar
.
If you want to build an über-jar, just add the --uber-jar
option to the command line:
./gradlew quarkusBuild --uber-jar
You can create a native executable using: ./gradlew build -Dquarkus.package.type=native
.
Or, if you don't have GraalVM installed, you can run the native executable build in a container using: ./gradlew build -Dquarkus.package.type=native -Dquarkus.native.container-build=true
.
You can then execute your native executable with: ./build/jynx-1.0-SNAPSHOT-runner
If you want to learn more about building native executables, please consult https://quarkus.io/guides/gradle-tooling#building-a-native-executable.