diff --git a/pom.xml b/pom.xml index d61a116..ed71c0f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,21 +3,23 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.acme - code-with-quarkus - 1.0.0-SNAPSHOT + com.backend.metadata.kodik.service + anyame-kodik-metadata-backend + 0.0.1-SNAPSHOT + quarkus 3.14.1 - 21 + 25 UTF-8 UTF-8 quarkus-bom io.quarkus.platform - 3.30.8 + 3.31.1 true 3.5.4 + 1.2.0 2.11.0 @@ -43,22 +45,30 @@ quarkus-rest - io.quarkiverse.retrofit - quarkus-easy-retrofit - 1.2.0 + io.quarkus + quarkus-rest-jackson io.quarkus - quarkus-rest-jackson + quarkus-smallrye-stork + + + io.smallrye.stork + stork-service-registration-consul com.squareup.retrofit2 converter-jackson ${retrofit.version} + + io.quarkiverse.retrofit + quarkus-easy-retrofit + ${easy-retrofit.version} + io.quarkus - quarkus-junit5 + quarkus-junit test @@ -75,16 +85,6 @@ quarkus-maven-plugin ${quarkus.platform.version} true - - - - build - generate-code - generate-code-tests - native-image-agent - - - maven-compiler-plugin @@ -97,7 +97,7 @@ maven-surefire-plugin ${surefire-plugin.version} - --add-opens java.base/java.lang=ALL-UNNAMED + @{argLine} org.jboss.logmanager.LogManager ${maven.home} @@ -116,7 +116,7 @@ - --add-opens java.base/java.lang=ALL-UNNAMED + @{argLine} ${project.build.directory}/${project.build.finalName}-runner @@ -144,3 +144,4 @@ + diff --git a/src/main/docker-compose/jvm.yml b/src/main/docker-compose/jvm.yml new file mode 100644 index 0000000..0141c7c --- /dev/null +++ b/src/main/docker-compose/jvm.yml @@ -0,0 +1,23 @@ +services: + kodik-metadata-service: + build: + context: ../../../. + dockerfile: src/main/docker/Dockerfile.jvm + container_name: kodik-metadata-service + restart: on-failure + env_file: ../../../.env + networks: + - anyame-consul + deploy: + resources: + limits: + memory: 512M + cpus: "1" + reservations: + memory: 128M + cpus: "0.3" + +networks: + anyame-consul: + name: anyame-consul + external: true diff --git a/src/main/docker-compose/native.yml b/src/main/docker-compose/native.yml new file mode 100644 index 0000000..d5a1004 --- /dev/null +++ b/src/main/docker-compose/native.yml @@ -0,0 +1,23 @@ +services: + kodik-metadata-service: + build: + context: ../../../. + dockerfile: src/main/docker/Dockerfile.native-micro + container_name: kodik-metadata-service + restart: on-failure + env_file: ../../../.env + networks: + - anyame-consul + deploy: + resources: + limits: + memory: 512M + cpus: "1" + reservations: + memory: 128M + cpus: "0.3" + +networks: + anyame-consul: + name: anyame-consul + external: true diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm index 4a690e6..b7079fd 100644 --- a/src/main/docker/Dockerfile.jvm +++ b/src/main/docker/Dockerfile.jvm @@ -7,11 +7,11 @@ # # Then, build the image with: # -# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/code-with-quarkus-jvm . +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/anyame-kodik-metadata-backend-jvm . # # Then run the container using: # -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-jvm +# docker run -i --rm -p 8080:8080 quarkus/anyame-kodik-metadata-backend-jvm # # If you want to include the debug port into your docker image # you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. @@ -20,7 +20,7 @@ # # Then run the container using : # -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-jvm +# docker run -i --rm -p 8080:8080 quarkus/anyame-kodik-metadata-backend-jvm # # This image uses the `run-java.sh` script to run the application. # This scripts computes the command line to execute your Java application, and @@ -77,8 +77,10 @@ # - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be # accessed directly. (example: "foo.example.com,bar.example.com") # +# You can find more information about the UBI base runtime images and their configuration here: +# https://rh-openjdk.github.io/redhat-openjdk-containers/ ### -FROM registry.access.redhat.com/ubi9/openjdk-21:1.23 +FROM registry.access.redhat.com/ubi9/openjdk-25:1.24 ENV LANGUAGE='en_US:en' diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar index 87bacc1..0d75cb4 100644 --- a/src/main/docker/Dockerfile.legacy-jar +++ b/src/main/docker/Dockerfile.legacy-jar @@ -7,11 +7,11 @@ # # Then, build the image with: # -# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/code-with-quarkus-legacy-jar . +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/anyame-kodik-metadata-backend-legacy-jar . # # Then run the container using: # -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-legacy-jar +# docker run -i --rm -p 8080:8080 quarkus/anyame-kodik-metadata-backend-legacy-jar # # If you want to include the debug port into your docker image # you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. @@ -20,7 +20,7 @@ # # Then run the container using : # -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-legacy-jar +# docker run -i --rm -p 8080:8080 quarkus/anyame-kodik-metadata-backend-legacy-jar # # This image uses the `run-java.sh` script to run the application. # This scripts computes the command line to execute your Java application, and @@ -77,8 +77,10 @@ # - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be # accessed directly. (example: "foo.example.com,bar.example.com") # +# You can find more information about the UBI base runtime images and their configuration here: +# https://rh-openjdk.github.io/redhat-openjdk-containers/ ### -FROM registry.access.redhat.com/ubi9/openjdk-21:1.23 +FROM registry.access.redhat.com/ubi9/openjdk-25:1.23 ENV LANGUAGE='en_US:en' diff --git a/src/main/docker/Dockerfile.native b/src/main/docker/Dockerfile.native index ea38eb7..a2740cf 100644 --- a/src/main/docker/Dockerfile.native +++ b/src/main/docker/Dockerfile.native @@ -7,11 +7,11 @@ # # Then, build the image with: # -# docker build -f src/main/docker/Dockerfile.native -t quarkus/code-with-quarkus . +# docker build -f src/main/docker/Dockerfile.native -t quarkus/anyame-kodik-metadata-backend . # # Then run the container using: # -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus +# docker run -i --rm -p 8080:8080 quarkus/anyame-kodik-metadata-backend # # The ` registry.access.redhat.com/ubi9/ubi-minimal:9.7` base image is based on UBI 9. # To use UBI 8, switch to `quay.io/ubi8/ubi-minimal:8.10`. diff --git a/src/main/docker/Dockerfile.native-micro b/src/main/docker/Dockerfile.native-micro index 63a5976..c0d8586 100644 --- a/src/main/docker/Dockerfile.native-micro +++ b/src/main/docker/Dockerfile.native-micro @@ -10,11 +10,11 @@ # # Then, build the image with: # -# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/code-with-quarkus . +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/anyame-kodik-metadata-backend . # # Then run the container using: # -# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus +# docker run -i --rm -p 8080:8080 quarkus/anyame-kodik-metadata-backend # # The `quay.io/quarkus/ubi9-quarkus-micro-image:2.0` base image is based on UBI 9. # To use UBI 8, switch to `quay.io/quarkus/quarkus-micro-image:2.0`. diff --git a/src/main/java/com/backend/metadata/kodik/service/ApplicationBeanProducer.java b/src/main/java/com/backend/metadata/kodik/service/ApplicationBeanProducer.java new file mode 100644 index 0000000..9b9fb1a --- /dev/null +++ b/src/main/java/com/backend/metadata/kodik/service/ApplicationBeanProducer.java @@ -0,0 +1,30 @@ +package com.backend.metadata.kodik.service; + +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; + +import io.quarkus.arc.lookup.LookupIfProperty; +import io.vertx.core.Vertx; +import io.vertx.ext.consul.ConsulClient; +import io.vertx.ext.consul.ConsulClientOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Produces; + +@ApplicationScoped +public class ApplicationBeanProducer { + Logger logger = Logger.getLogger(ApplicationBeanProducer.class); + + @ConfigProperty(name = "consul.host", defaultValue = "consul") + String host; + @ConfigProperty(name = "consul.port", defaultValue = "8500") + int port; + + @Produces + @LookupIfProperty(name = "quarkus.stork.kodik-metadata-service.service-registrar.type", stringValue = "consul") + public ConsulClient consulClient(Vertx vertx) { + return ConsulClient.create(vertx, new ConsulClientOptions() + .setHost(host) + .setPort(port)); + } + +} diff --git a/src/main/java/com/backend/metadata/kodik/service/ApplicationLifecycle.java b/src/main/java/com/backend/metadata/kodik/service/ApplicationLifecycle.java new file mode 100644 index 0000000..09dfafb --- /dev/null +++ b/src/main/java/com/backend/metadata/kodik/service/ApplicationLifecycle.java @@ -0,0 +1,56 @@ +package com.backend.metadata.kodik.service; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; + +import io.quarkus.runtime.ShutdownEvent; +import io.quarkus.runtime.StartupEvent; +import io.vertx.ext.consul.ConsulClient; +import io.vertx.ext.consul.ServiceOptions; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jakarta.enterprise.inject.Instance; + +@ApplicationScoped +public class ApplicationLifecycle { + + @ConfigProperty(name = "quarkus.application.name") + private String appName; + @ConfigProperty(name = "quarkus.application.port", defaultValue = "8080") + private int port; + + private Logger logger; + private Instance consulClient; + private ScheduledExecutorService executor; + + public ApplicationLifecycle(Logger logger, + Instance consulClient, + ScheduledExecutorService executor) { + this.logger = logger; + this.consulClient = consulClient; + this.executor = executor; + } + + void onStart(@Observes StartupEvent ev) { + if (consulClient.isResolvable()) { + executor.schedule(() -> { + consulClient.get().registerService(new ServiceOptions() + .setPort(port) + .setAddress(appName) + .setName(appName) + .setId(appName + "-" + port), + result -> logger.infof("Service %s-%d registered", appName, port)); + }, 1000, TimeUnit.MILLISECONDS); + } + } + + void onStop(@Observes ShutdownEvent ev) { + if (consulClient.isResolvable()) { + consulClient.get().deregisterService(appName + "-" + port, + result -> logger.infof("Service %s-%d deregistered", appName, port)); + } + } +} diff --git a/src/main/java/com/backend/search/kodik/service/api/JacksonConvertFactoryBuilder.java b/src/main/java/com/backend/metadata/kodik/service/api/JacksonConvertFactoryBuilder.java similarity index 90% rename from src/main/java/com/backend/search/kodik/service/api/JacksonConvertFactoryBuilder.java rename to src/main/java/com/backend/metadata/kodik/service/api/JacksonConvertFactoryBuilder.java index f78ea90..4da8c22 100644 --- a/src/main/java/com/backend/search/kodik/service/api/JacksonConvertFactoryBuilder.java +++ b/src/main/java/com/backend/metadata/kodik/service/api/JacksonConvertFactoryBuilder.java @@ -1,4 +1,4 @@ -package com.backend.search.kodik.service.api; +package com.backend.metadata.kodik.service.api; import jakarta.enterprise.context.ApplicationScoped; diff --git a/src/main/java/com/backend/search/kodik/service/api/KodikAPI.java b/src/main/java/com/backend/metadata/kodik/service/api/KodikAPI.java similarity index 83% rename from src/main/java/com/backend/search/kodik/service/api/KodikAPI.java rename to src/main/java/com/backend/metadata/kodik/service/api/KodikAPI.java index 72f3722..39096c9 100644 --- a/src/main/java/com/backend/search/kodik/service/api/KodikAPI.java +++ b/src/main/java/com/backend/metadata/kodik/service/api/KodikAPI.java @@ -1,6 +1,6 @@ -package com.backend.search.kodik.service.api; +package com.backend.metadata.kodik.service.api; -import com.backend.search.kodik.service.api.model.KodikResponse; +import com.backend.metadata.kodik.service.api.model.KodikResponse; import io.github.easyretrofit.core.annotation.RetrofitBuilder; import retrofit2.Call; diff --git a/src/main/java/com/backend/search/kodik/service/api/model/KodikResponse.java b/src/main/java/com/backend/metadata/kodik/service/api/model/KodikResponse.java similarity index 98% rename from src/main/java/com/backend/search/kodik/service/api/model/KodikResponse.java rename to src/main/java/com/backend/metadata/kodik/service/api/model/KodikResponse.java index a939d77..1155423 100644 --- a/src/main/java/com/backend/search/kodik/service/api/model/KodikResponse.java +++ b/src/main/java/com/backend/metadata/kodik/service/api/model/KodikResponse.java @@ -1,4 +1,4 @@ -package com.backend.search.kodik.service.api.model; +package com.backend.metadata.kodik.service.api.model; import java.util.List; diff --git a/src/main/java/com/backend/search/kodik/service/api/model/MaterialData.java b/src/main/java/com/backend/metadata/kodik/service/api/model/MaterialData.java similarity index 98% rename from src/main/java/com/backend/search/kodik/service/api/model/MaterialData.java rename to src/main/java/com/backend/metadata/kodik/service/api/model/MaterialData.java index 6c07e57..7875f87 100644 --- a/src/main/java/com/backend/search/kodik/service/api/model/MaterialData.java +++ b/src/main/java/com/backend/metadata/kodik/service/api/model/MaterialData.java @@ -1,4 +1,4 @@ -package com.backend.search.kodik.service.api.model; +package com.backend.metadata.kodik.service.api.model; import java.util.List; diff --git a/src/main/java/com/backend/search/kodik/service/resource/SearchResource.java b/src/main/java/com/backend/metadata/kodik/service/resource/SearchResource.java similarity index 79% rename from src/main/java/com/backend/search/kodik/service/resource/SearchResource.java rename to src/main/java/com/backend/metadata/kodik/service/resource/SearchResource.java index 30a9e17..ebaeca8 100644 --- a/src/main/java/com/backend/search/kodik/service/resource/SearchResource.java +++ b/src/main/java/com/backend/metadata/kodik/service/resource/SearchResource.java @@ -1,4 +1,4 @@ -package com.backend.search.kodik.service.resource; +package com.backend.metadata.kodik.service.resource; import java.io.IOException; @@ -6,10 +6,10 @@ import javax.naming.ServiceUnavailableException; import org.jboss.logging.Logger; -import com.backend.search.kodik.service.api.KodikAPI; -import com.backend.search.kodik.service.api.model.KodikResponse; -import com.backend.search.kodik.service.service.KodikAPITokenProvider; -import com.backend.search.kodik.service.service.KodikSearchFilterService; +import com.backend.metadata.kodik.service.api.KodikAPI; +import com.backend.metadata.kodik.service.api.model.KodikResponse; +import com.backend.metadata.kodik.service.service.KodikAPITokenProvider; +import com.backend.metadata.kodik.service.service.KodikSearchFilterService; import io.quarkiverse.retrofit.runtime.EnableRetrofit; import jakarta.ws.rs.BadRequestException; @@ -18,8 +18,8 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.QueryParam; import retrofit2.Response; -@EnableRetrofit("com.backend.search.kodik.service.api") -@Path("/search") +@EnableRetrofit("com.backend.metadata.kodik.service.api") +@Path("/kodik") public class SearchResource { private static final Logger LOG = Logger.getLogger(SearchResource.class); private final KodikAPI kodikAPI; @@ -34,6 +34,7 @@ public class SearchResource { } @GET + @Path("/search") public KodikResponse search(@QueryParam("title") String title) throws ServiceUnavailableException { try { Response response = kodikAPI.search(tokenProvider.getKodikToken(), title, 100, 1).execute(); diff --git a/src/main/java/com/backend/search/kodik/service/service/KodikAPITokenProvider.java b/src/main/java/com/backend/metadata/kodik/service/service/KodikAPITokenProvider.java similarity index 85% rename from src/main/java/com/backend/search/kodik/service/service/KodikAPITokenProvider.java rename to src/main/java/com/backend/metadata/kodik/service/service/KodikAPITokenProvider.java index 9881927..8864e6a 100644 --- a/src/main/java/com/backend/search/kodik/service/service/KodikAPITokenProvider.java +++ b/src/main/java/com/backend/metadata/kodik/service/service/KodikAPITokenProvider.java @@ -1,4 +1,4 @@ -package com.backend.search.kodik.service.service; +package com.backend.metadata.kodik.service.service; import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.config.inject.ConfigProperty; diff --git a/src/main/java/com/backend/search/kodik/service/service/KodikSearchFilterService.java b/src/main/java/com/backend/metadata/kodik/service/service/KodikSearchFilterService.java similarity index 93% rename from src/main/java/com/backend/search/kodik/service/service/KodikSearchFilterService.java rename to src/main/java/com/backend/metadata/kodik/service/service/KodikSearchFilterService.java index 77b5b3a..3d44988 100644 --- a/src/main/java/com/backend/search/kodik/service/service/KodikSearchFilterService.java +++ b/src/main/java/com/backend/metadata/kodik/service/service/KodikSearchFilterService.java @@ -1,6 +1,4 @@ -package com.backend.search.kodik.service.service; - -import jakarta.enterprise.context.ApplicationScoped; +package com.backend.metadata.kodik.service.service; import java.util.ArrayList; import java.util.Arrays; @@ -11,7 +9,9 @@ import java.util.Set; import org.jboss.logging.Logger; -import com.backend.search.kodik.service.api.model.KodikResponse; +import com.backend.metadata.kodik.service.api.model.KodikResponse; + +import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class KodikSearchFilterService { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 956e993..9c8d2f4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,5 @@ +quarkus.application.name=kodik-metadata-service kodik.api.url=https://kodikapi.com/ + +quarkus.stork.kodik-metadata-service.service-registrar.type=consul + diff --git a/src/test/java/org/acme/GreetingResourceIT.java b/src/test/java/com/backend/metadata/kodik/service/GreetingResourceIT.java similarity index 64% rename from src/test/java/org/acme/GreetingResourceIT.java rename to src/test/java/com/backend/metadata/kodik/service/GreetingResourceIT.java index cfa9d1b..897cf6d 100644 --- a/src/test/java/org/acme/GreetingResourceIT.java +++ b/src/test/java/com/backend/metadata/kodik/service/GreetingResourceIT.java @@ -1,8 +1,8 @@ -package org.acme; +package com.backend.metadata.kodik.service; import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -class GreetingResourceIT extends GreetingResourceTest { +class GreetingResourceIT { // Execute the same tests but in packaged mode. } diff --git a/src/test/java/org/acme/GreetingResourceTest.java b/src/test/java/org/acme/GreetingResourceTest.java deleted file mode 100644 index 18332e4..0000000 --- a/src/test/java/org/acme/GreetingResourceTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.acme; - -import io.quarkus.test.junit.QuarkusTest; -import org.junit.jupiter.api.Test; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; - -@QuarkusTest -class GreetingResourceTest { - @Test - void testHelloEndpoint() { - given() - .when().get("/hello") - .then() - .statusCode(200) - .body(is("Hello from Quarkus REST")); - } - -} \ No newline at end of file