commit 0a19aa16111fd15005f87e384124c717a0349348 Author: 1445458000@qq.com <1445458000@qq.com> Date: Mon Feb 24 16:30:52 2025 +0800 初始化项目 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..94810d0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d9ca3d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +#Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties +.flattened-pom.xml + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# patch +*.orig +*.rej + +# Local environment +.env + +# Plugin directory +/.quarkus/cli/plugins/ + +#PID files +*.pid diff --git a/.mvn/wrapper/.gitignore b/.mvn/wrapper/.gitignore new file mode 100644 index 0000000..e72f5e8 --- /dev/null +++ b/.mvn/wrapper/.gitignore @@ -0,0 +1 @@ +maven-wrapper.jar diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..84d1e60 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +public final class MavenWrapperDownloader +{ + private static final String WRAPPER_VERSION = "3.2.0"; + + private static final boolean VERBOSE = Boolean.parseBoolean( System.getenv( "MVNW_VERBOSE" ) ); + + public static void main( String[] args ) + { + log( "Apache Maven Wrapper Downloader " + WRAPPER_VERSION ); + + if ( args.length != 2 ) + { + System.err.println( " - ERROR wrapperUrl or wrapperJarPath parameter missing" ); + System.exit( 1 ); + } + + try + { + log( " - Downloader started" ); + final URL wrapperUrl = new URL( args[0] ); + final String jarPath = args[1].replace( "..", "" ); // Sanitize path + final Path wrapperJarPath = Paths.get( jarPath ).toAbsolutePath().normalize(); + downloadFileFromURL( wrapperUrl, wrapperJarPath ); + log( "Done" ); + } + catch ( IOException e ) + { + System.err.println( "- Error downloading: " + e.getMessage() ); + if ( VERBOSE ) + { + e.printStackTrace(); + } + System.exit( 1 ); + } + } + + private static void downloadFileFromURL( URL wrapperUrl, Path wrapperJarPath ) + throws IOException + { + log( " - Downloading to: " + wrapperJarPath ); + if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( "MVNW_PASSWORD" ) != null ) + { + final String username = System.getenv( "MVNW_USERNAME" ); + final char[] password = System.getenv( "MVNW_PASSWORD" ).toCharArray(); + Authenticator.setDefault( new Authenticator() + { + @Override + protected PasswordAuthentication getPasswordAuthentication() + { + return new PasswordAuthentication( username, password ); + } + } ); + } + try ( InputStream inStream = wrapperUrl.openStream() ) + { + Files.copy( inStream, wrapperJarPath, StandardCopyOption.REPLACE_EXISTING ); + } + log( " - Downloader complete" ); + } + + private static void log( String msg ) + { + if ( VERBOSE ) + { + System.out.println( msg ); + } + } + +} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..70f4f50 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.8/apache-maven-3.8.8-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/README.md b/README.md new file mode 100644 index 0000000..3493567 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# Microservices with Camel Quarkus + +This project shows four microservices implemented using Apache Camel on Quarkus, +as follows: + +- ```aws-camelk-file```: this microservice is polling the ```/tmp/input``` local folder and, as soon as an XML file is comming, it store it in an AWS S3 bucket, which name starts with ```mys3``` followed by a random suffix. +- ```aws-camelk-s3```: this microservice is listening on the first found AWS S3 bucket which name starts with ```mys3``` and, as soon as an XML file comes in, it splits, tokenizes and streams it, before sending each message to an AWS SQS queue, which name is ```myQue```. +- ```aws-camelk-sqs```: this microservice subscribes for messages to the AWS SQS queue named ```myQueue``` and, for each incoming message, unmarshall it from XML to Java objects, the marshal it to JSON format, before sending it to the REST service below. +- ```aws-camelk-jaxrs```: this microservice exposes a REST API having endpoint for CRUDing money transfer orders. It consumes/produces JSON input/output data. It uses a service which exposes and interface defined by ```aws-camelk-api``` project. Several implementations of this interface might be present but, for simplicity sake, in the current case we're using the one defined by ```aws-camelk-provider``` project, named ```DefaultMoneyTransferProvider```, which only CRUds the money transfer order requests in an in-memory hash map. + +## Deploying and running locally the microservices + +In order to deploy and run the miroservices locally, proceed as follows: + +### Clone the project from GitHub + +Here are the steps required to clone the project: + + $ git clone https://github.com/nicolasduminil/aws-camelk.git + $ cd aws-camelk + +### Start the microservices + +In order to start the microservices, run the following script: + + $ ./start-ms.sh + +### Stop the microservices + +In order to stop the microservices, run the following script: + + $ ./kill-ms.sh + +### Cleaning up the AWS infrastructure + +In order to clean up the AWS infrastructure, run the commands below: + + $ ./delete-all-buckets.sh + $ ./purge-sqs-queue.sh + $ ./delete-sqs-queue.sh diff --git a/aws-camelk-api/.gitignore b/aws-camelk-api/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/aws-camelk-api/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/aws-camelk-api/pom.xml b/aws-camelk-api/pom.xml new file mode 100644 index 0000000..d2aa8a2 --- /dev/null +++ b/aws-camelk-api/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + + aws-camelk-api + AWS CamelK :: The API Module + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-model + + + + ${project.artifactId} + + + io.smallrye + jandex-maven-plugin + + + + \ No newline at end of file diff --git a/aws-camelk-api/src/main/java/fr/simplex_software/quarkus/camel/integrations/api/MoneyTransferFacade.java b/aws-camelk-api/src/main/java/fr/simplex_software/quarkus/camel/integrations/api/MoneyTransferFacade.java new file mode 100644 index 0000000..a4d3340 --- /dev/null +++ b/aws-camelk-api/src/main/java/fr/simplex_software/quarkus/camel/integrations/api/MoneyTransferFacade.java @@ -0,0 +1,15 @@ +package fr.simplex_software.quarkus.camel.integrations.api; + +import fr.simplex_software.quarkus.camel.integrations.jaxb.*; + +import java.io.*; +import java.util.*; + +public interface MoneyTransferFacade extends Serializable +{ + List getMoneyTransferOrders(); + Optional getMoneyTransferOrder(String reference); + String createMoneyTransferOrder(MoneyTransfer moneyTransfer); + void updateMoneyTransferOrder(String ref, MoneyTransfer moneyTransfer); + void deleteMoneyTransferOrder(String ref); +} diff --git a/aws-camelk-file/.gitignore b/aws-camelk-file/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/aws-camelk-file/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/aws-camelk-file/pom.xml b/aws-camelk-file/pom.xml new file mode 100644 index 0000000..64133d8 --- /dev/null +++ b/aws-camelk-file/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + + aws-camelk-file + AWS CamelK :: The File to S3 Module + + + org.apache.camel.quarkus + camel-quarkus-file + + + org.apache.camel.quarkus + camel-quarkus-aws2-s3 + + + com.amazonaws + aws-java-sdk-s3 + + + org.apache.camel.quarkus + camel-quarkus-validator + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-model + + + + ${project.artifactId} + + + io.quarkus.platform + quarkus-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + + \ No newline at end of file diff --git a/aws-camelk-file/src/main/java/fr/simplex_software/quarkus/camel/integrations/file/FileToS3Route.java b/aws-camelk-file/src/main/java/fr/simplex_software/quarkus/camel/integrations/file/FileToS3Route.java new file mode 100644 index 0000000..1f0b7c3 --- /dev/null +++ b/aws-camelk-file/src/main/java/fr/simplex_software/quarkus/camel/integrations/file/FileToS3Route.java @@ -0,0 +1,46 @@ +package fr.simplex_software.quarkus.camel.integrations.file; + +import org.apache.camel.*; +import org.apache.camel.builder.*; +import org.apache.camel.component.aws2.s3.*; +import org.apache.camel.component.file.*; +import org.eclipse.microprofile.config.inject.*; + +import javax.enterprise.context.*; +import java.io.*; +import java.util.*; + +import static org.apache.camel.builder.endpoint.StaticEndpointBuilders.*; + +@ApplicationScoped +public class FileToS3Route extends RouteBuilder +{ + private static final String RANDOM = new Random().ints('a', 'z') + .limit(5) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + @ConfigProperty(name="inBox") + String inBox; + @ConfigProperty(name="s3Name") + String s3Name; + @ConfigProperty(name="exMsg") + String exMsg; + @ConfigProperty(name="validation-failure-msg") + String failureMsg; + + public void configure() throws Exception + { + onException(IOException.class) + .handled(true) + .log(LoggingLevel.ERROR, exMsg + " ${exception.message}"); + fromF("file://%s?include=.*.xml&delete=true&idempotent=true&bridgeErrorHandler=true", inBox) + .doTry() + .to("validator:xsd/money-transfers.xsd") + .setHeader(AWS2S3Constants.KEY, header(FileConstants.FILE_NAME)) + .to(aws2S3(s3Name + RANDOM).autoCreateBucket(true).useDefaultCredentialsProvider(true)) + .doCatch(ValidationException.class) + .log(LoggingLevel.ERROR, failureMsg + " ${exception.message}") + .doFinally() + .end(); + } +} diff --git a/aws-camelk-file/src/main/resources/application.properties b/aws-camelk-file/src/main/resources/application.properties new file mode 100644 index 0000000..0c148f7 --- /dev/null +++ b/aws-camelk-file/src/main/resources/application.properties @@ -0,0 +1,4 @@ +inBox=tmp/input +s3Name=mys3 +exMsg="IOException occurred due:" +validation-failure-msg="### FileToS3Route.configure(): Cannot validate XML payload against XSD grammar" \ No newline at end of file diff --git a/aws-camelk-file/src/main/resources/xsd/money-transfer.xsd b/aws-camelk-file/src/main/resources/xsd/money-transfer.xsd new file mode 100644 index 0000000..0f212a7 --- /dev/null +++ b/aws-camelk-file/src/main/resources/xsd/money-transfer.xsd @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aws-camelk-file/src/main/resources/xsd/money-transfers.xsd b/aws-camelk-file/src/main/resources/xsd/money-transfers.xsd new file mode 100644 index 0000000..3d42325 --- /dev/null +++ b/aws-camelk-file/src/main/resources/xsd/money-transfers.xsd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aws-camelk-file/src/test/java/fr/simplex_software/quarkus/camel/integrations/file/tests/TestFileToS3Route.java b/aws-camelk-file/src/test/java/fr/simplex_software/quarkus/camel/integrations/file/tests/TestFileToS3Route.java new file mode 100644 index 0000000..88d6317 --- /dev/null +++ b/aws-camelk-file/src/test/java/fr/simplex_software/quarkus/camel/integrations/file/tests/TestFileToS3Route.java @@ -0,0 +1,56 @@ +package fr.simplex_software.quarkus.camel.integrations.file.tests; + +import com.amazonaws.services.s3.*; +import com.amazonaws.services.s3.model.*; +import io.quarkus.test.junit.*; +import org.apache.camel.*; +import org.junit.jupiter.api.*; + +import java.util.*; + +import static org.assertj.core.api.Assertions.*; + +@QuarkusTest +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class TestFileToS3Route +{ + @EndpointInject("file://tmp/input?delete=true&idempotent=true") + ProducerTemplate producerTemplate; + private static AmazonS3 amazonS3Client; + private static List buckets; + + @BeforeAll + public static void beforeAll() + { + amazonS3Client = AmazonS3ClientBuilder.standard().build(); + buckets = amazonS3Client.listBuckets(); + } + + @AfterAll + public static void afterAll() + { + amazonS3Client = null; + buckets = null; + } + + @Test + @Order(10) + public void testStoreFileToS3() throws InterruptedException + { + producerTemplate.sendBodyAndHeader("Test", Exchange.FILE_NAME, "test.txt"); + Thread.sleep(2000); + assertThat(buckets).isNotNull(); + assertThat(buckets.size()).isGreaterThan(0); + assertThat(buckets.stream().anyMatch(b -> b.getName().startsWith("mys3"))).isTrue(); + + } + + @Test + public void testRemoveS3Bucket() + { + String bucketName = buckets.stream().filter(b -> b.getName().startsWith("mys3")).findFirst().orElseThrow().getName(); + assertThat(bucketName).isNotNull(); + amazonS3Client.listObjects(bucketName).getObjectSummaries().forEach(os -> amazonS3Client.deleteObject(bucketName, os.getKey())); + amazonS3Client.deleteBucket(bucketName); + } +} diff --git a/aws-camelk-file/tmp/input/test.txt b/aws-camelk-file/tmp/input/test.txt new file mode 100644 index 0000000..8318c86 --- /dev/null +++ b/aws-camelk-file/tmp/input/test.txt @@ -0,0 +1 @@ +Test \ No newline at end of file diff --git a/aws-camelk-jaxrs/.gitignore b/aws-camelk-jaxrs/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/aws-camelk-jaxrs/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/aws-camelk-jaxrs/pom.xml b/aws-camelk-jaxrs/pom.xml new file mode 100644 index 0000000..3af5dc7 --- /dev/null +++ b/aws-camelk-jaxrs/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + + aws-camelk-jaxrs + AWS CamelK :: The JAX-RS Module + + + io.quarkus + quarkus-resteasy-reactive-jsonb + + + io.quarkus + quarkus-smallrye-openapi + + + io.quarkus + quarkus-smallrye-metrics + + + io.quarkus + quarkus-smallrye-fault-tolerance + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-provider + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-model + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-api + 1.0.0-SNAPSHOT + + + + ${project.artifactId} + + + io.quarkus.platform + quarkus-maven-plugin + + + + \ No newline at end of file diff --git a/aws-camelk-jaxrs/src/main/java/fr/simplex_software/quarkus/camel/integrations/jaxrs/MoneyTransferResource.java b/aws-camelk-jaxrs/src/main/java/fr/simplex_software/quarkus/camel/integrations/jaxrs/MoneyTransferResource.java new file mode 100644 index 0000000..661f302 --- /dev/null +++ b/aws-camelk-jaxrs/src/main/java/fr/simplex_software/quarkus/camel/integrations/jaxrs/MoneyTransferResource.java @@ -0,0 +1,121 @@ +package fr.simplex_software.quarkus.camel.integrations.jaxrs; + +import fr.simplex_software.quarkus.camel.integrations.api.*; +import fr.simplex_software.quarkus.camel.integrations.jaxb.*; +import org.eclipse.microprofile.faulttolerance.*; +import org.eclipse.microprofile.faulttolerance.exceptions.*; +import org.eclipse.microprofile.metrics.*; +import org.eclipse.microprofile.metrics.annotation.Metered; +import org.eclipse.microprofile.openapi.annotations.*; +import org.eclipse.microprofile.openapi.annotations.media.*; +import org.eclipse.microprofile.openapi.annotations.responses.*; + +import javax.enterprise.context.*; +import javax.inject.*; +import javax.ws.rs.*; +import javax.ws.rs.core.*; +import java.util.*; + +import static javax.ws.rs.core.MediaType.*; + +@ApplicationScoped +@Path("xfer") +public class MoneyTransferResource +{ + @Inject + MoneyTransferFacade moneyTransferFacade; + + @GET + @Path("live") + @Produces(TEXT_PLAIN) + public Response testIfLive() + { + return Response.ok("Live").build(); + } + + @GET + @Path("ready") + @Produces(TEXT_PLAIN) + public Response testIfReady() + { + return Response.ok("Ready").build(); + } + + @GET + @Produces(APPLICATION_JSON) + @Operation(description = "Get the money transfer orders list") + @APIResponse(responseCode = "404", description = "No money transfer orders found", + content = @Content(mediaType = APPLICATION_JSON)) + @APIResponseSchema(value = MoneyTransfer.class, responseDescription = "Money transfer orders list", responseCode = "200") + @Metered(name = "Get money transfer orders", unit = MetricUnits.MINUTES, description = "Metric to monitor the frequency of the getMoneyTransferOrders endpoint invocations", absolute = true) + @Timeout(250) + public Response getMoneyTransferOrders() + { + GenericEntity> listGenericEntity = new GenericEntity<>(moneyTransferFacade.getMoneyTransferOrders()) {}; + return Response.ok().entity(listGenericEntity).build(); + } + + @GET + @Path("{ref}") + @Produces(APPLICATION_JSON) + @Operation(description = "Get the money transfer order identified by reference") + @APIResponse(responseCode = "404", description = "No such a money transfer order found", + content = @Content(mediaType = APPLICATION_JSON)) + @APIResponseSchema(value = MoneyTransfer.class, responseDescription = "Money transfer order found", responseCode = "200") + @Metered(name = "Get money transfer order", unit = MetricUnits.MINUTES, description = "Metric to monitor the frequency of the getMoneyTransferOrder endpoint invocations", absolute = true) + @Fallback(fallbackMethod = "fallbackOfGetMoneyTransferOrder") + public Response getMoneyTransferOrder(@PathParam("ref") String reference) + { + return Response.ok().entity(moneyTransferFacade.getMoneyTransferOrder(reference).orElseThrow()).build(); + } + + @POST + @Consumes(APPLICATION_JSON) + @Operation(description = "Create a new money transfer order") + @APIResponse(responseCode = "500", description = "An internal server error has occurred", + content = @Content(mediaType = APPLICATION_XML)) + @APIResponseSchema(value = MoneyTransfer.class, responseDescription = "The new money transfer order has been created", responseCode = "201") + @Metered(name = "Create money transfer order", unit = MetricUnits.MINUTES, description = "Metric to monitor the frequency of the createMoneyTransferOrder endpoint invocations", absolute = true) + @Timeout(250) + @Retry(retryOn = TimeoutException.class, maxRetries = 2) + public Response createMoneyTransferOrder(MoneyTransfer moneyTransfer, @Context UriInfo uriInfo) + { + String ref = moneyTransferFacade.createMoneyTransferOrder(moneyTransfer); + UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder(); + uriBuilder.path(ref); + return Response.created(uriBuilder.build()).build(); + } + + @PUT + @Path("{ref}") + @Consumes(APPLICATION_JSON) + @Operation(description = "Update a money transfer order") + @APIResponse(responseCode = "404", description = "The money transfer order does not exist", + content = @Content(mediaType = APPLICATION_JSON)) + @APIResponseSchema(value = MoneyTransfer.class, responseDescription = "The Money transfer orderhas been updated", responseCode = "200") + @Metered(name = "Update a money transfer order", unit = MetricUnits.MINUTES, description = "Metric to monitor the frequency of the updateMoneyTransferOrder endpoint invocations", absolute = true) + @CircuitBreaker(successThreshold = 5, requestVolumeThreshold = 4, failureRatio = 0.75, delay = 1000) + public Response updateMoneyTransferOrder(@PathParam("ref") String ref, MoneyTransfer moneyTransfer) + { + moneyTransferFacade.updateMoneyTransferOrder(ref, moneyTransfer); + return Response.accepted().build(); + } + + @DELETE + @Path("{ref}") + @Operation(description = "Delete a money transfer order") + @APIResponse(responseCode = "404", description = "The money transfer order does not exist", + content = @Content(mediaType = APPLICATION_JSON)) + @APIResponseSchema(value = MoneyTransfer.class, responseDescription = "The money transfer order has been deleted", responseCode = "200") + @Metered(name = "Delete a money transfer order", unit = MetricUnits.MINUTES, description = "Metric to monitor the frequency of the deleteMoneyTransferOrders endpoint invocations", absolute = true) + public Response deleteMoneyTransferOrder(@PathParam("ref") String reference) + { + moneyTransferFacade.deleteMoneyTransferOrder(reference); + return Response.ok().build(); + } + + public Response fallbackOfGetMoneyTransferOrder(String reference) + { + return Response.noContent().build(); + } +} diff --git a/aws-camelk-jaxrs/src/test/java/fr/simplex_software/quarkus/camel/integrations/jaxrs/tests/TestMoneyTransferResource.java b/aws-camelk-jaxrs/src/test/java/fr/simplex_software/quarkus/camel/integrations/jaxrs/tests/TestMoneyTransferResource.java new file mode 100644 index 0000000..a87776e --- /dev/null +++ b/aws-camelk-jaxrs/src/test/java/fr/simplex_software/quarkus/camel/integrations/jaxrs/tests/TestMoneyTransferResource.java @@ -0,0 +1,151 @@ +package fr.simplex_software.quarkus.camel.integrations.jaxrs.tests; + +import fr.simplex_software.quarkus.camel.integrations.jaxb.*; +import fr.simplex_software.quarkus.camel.integrations.jaxrs.*; +import io.quarkus.test.common.http.*; +import io.quarkus.test.junit.*; +import io.restassured.common.mapper.*; +import io.restassured.http.*; +import io.restassured.mapper.*; +import io.restassured.response.*; +import io.restassured.specification.*; +import org.jboss.resteasy.reactive.*; +import org.junit.jupiter.api.*; + +import java.math.*; +import java.net.*; +import java.util.*; + +import static io.restassured.RestAssured.*; +import static org.assertj.core.api.Assertions.*; +import static org.hamcrest.Matchers.*; + +@QuarkusTest +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class TestMoneyTransferResource +{ + @TestHTTPEndpoint(MoneyTransferResource.class) + @TestHTTPResource + private URL url; + private RequestSpecification requestSpecification; + + @BeforeAll + public void beforeAll() + { + requestSpecification = given().baseUri(url.toString()); + } + + @AfterAll + public void afterAll() + { + requestSpecification = null; + } + + @Test + @Order(10) + public void testLivenessEndpoint() + { + requestSpecification.when().get("live").then().statusCode(200).body(is("Live")); + } + + @Test + @Order(20) + public void testReadinessEndpoint() + { + requestSpecification.when().get("ready").then().statusCode(200).body(is("Ready")); + } + + @Test + @Order(30) + public void testCreateMoneyTransferOrderEndpoint() + { + MoneyTransfer moneyTransfer = new MoneyTransfer("reference", + new BankAccount(new Bank(Arrays.asList(new BankAddress("rue de Paris", "24", + "BP 100", "Soisy sous Montmorency", "95230", "France")), + "Société Générale"), "accountId", BankAccountType.CHECKING, "sortCode", + "accountNumber", "transCode"), + new BankAccount(new Bank(Arrays.asList(new BankAddress("Argyle Street", "201", + "PO 258", "Glasgow", "G2 8BU", "UK")), + "Bank of Scotland"), "accountId2", BankAccountType.CHECKING, "sortCode2", + "accountNumber2", "transCode2"), + new BigDecimal(100.00)); + requestSpecification.when() + .contentType(ContentType.JSON) + .body(moneyTransfer, ObjectMapperType.JSONB) + .post() + .then() + .statusCode(RestResponse.StatusCode.CREATED) + .body(is(notNullValue())); + } + + @Test + @Order(40) + public void testGetMoneyTransferOrdersEndpoint() + { + Response response = requestSpecification.when() + .get() + .then() + .statusCode(RestResponse.StatusCode.OK) + .extract().response(); + assertThat(response).isNotNull(); + List moneyTransfers = response.as(new TypeRef>() {}); + assertThat(moneyTransfers).isNotNull(); + assertThat(moneyTransfers).isNotNull(); + assertThat(moneyTransfers).hasSize(1); + MoneyTransfer moneyTransfer = moneyTransfers.get(0); + assertThat(moneyTransfer).isNotNull(); + assertThat(moneyTransfer.getReference()).isEqualTo("reference"); + } + + @Test + @Order(50) + public void testGetMoneyTransferOrderEndpoint() + { + Response response = requestSpecification.when() + .pathParam("ref", "reference") + .get("{ref}") + .then() + .statusCode(RestResponse.StatusCode.OK) + .extract().response(); + assertThat(response).isNotNull(); + MoneyTransfer moneyTransfer = response.as(MoneyTransfer.class); + assertThat(moneyTransfer).isNotNull(); + assertThat(moneyTransfer.getReference()).isEqualTo("reference"); + } + + @Test + @Order(60) + public void testUpdateMoneyTransferOrderEndpoint() + { + MoneyTransfer moneyTransfer = new MoneyTransfer("reference", + new BankAccount(new Bank(Arrays.asList(new BankAddress("rue de Paris", "24", + "BP 100", "Soisy sous Montmorency", "95230", "France")), + "Société Générale"), "accountId", BankAccountType.CHECKING, "sortCode", + "accountNumber", "transCode"), + new BankAccount(new Bank(Arrays.asList(new BankAddress("Argyle Street", "201", + "PO 258", "Glasgow", "G2 8BU", "UK")), + "Bank of Scotland"), "accountId2", BankAccountType.CHECKING, "sortCode2", + "accountNumber2", "transCode2"), + new BigDecimal(500.00)); + requestSpecification.when() + .contentType(ContentType.JSON) + .body(moneyTransfer, ObjectMapperType.JSONB) + .pathParam("ref", "reference") + .put("{ref}") + .then() + .statusCode(RestResponse.StatusCode.ACCEPTED) + .body(is(notNullValue())); + } + + @Test + public void testDeleteMoneyTransferOrderEndpoint() + { + requestSpecification.when() + .pathParam("ref", "reference") + .delete("{ref}") + .then() + .statusCode(RestResponse.StatusCode.OK) + .body(is(notNullValue())); + } +} diff --git a/aws-camelk-model/.gitignore b/aws-camelk-model/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/aws-camelk-model/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/aws-camelk-model/pom.xml b/aws-camelk-model/pom.xml new file mode 100644 index 0000000..1cec345 --- /dev/null +++ b/aws-camelk-model/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + + AWS CamelK :: The Model Module + aws-camelk-model + + + io.quarkus + quarkus-jaxb + + + + ${project.artifactId} + + + org.codehaus.mojo + jaxb2-maven-plugin + 2.5.0 + + + org.jvnet.jaxb2_commons + jaxb2-value-constructor + 3.0 + + + + + + xjc + + + + + fr.simplex_software.quarkus.camel.integrations.jaxb + + ${basedir}/src/main/resources/xsd + + + -Xvalue-constructor + + true + + + + + \ No newline at end of file diff --git a/aws-camelk-model/src/main/resources/xml/money-transfer.xml b/aws-camelk-model/src/main/resources/xml/money-transfer.xml new file mode 100644 index 0000000..d27bd90 --- /dev/null +++ b/aws-camelk-model/src/main/resources/xml/money-transfer.xml @@ -0,0 +1,16 @@ + + Tech Repairs + + + + + + + + + + + 1000.00 + diff --git a/aws-camelk-model/src/main/resources/xml/money-transfers.xml b/aws-camelk-model/src/main/resources/xml/money-transfers.xml new file mode 100644 index 0000000..117c343 --- /dev/null +++ b/aws-camelk-model/src/main/resources/xml/money-transfers.xml @@ -0,0 +1,74 @@ + + + Tech Repairs + + + + + + + + + + + 1000.00 + + + Taxes and Licences + + + + + + + + + + + 800.00 + + + Advertising + + + + + + + + + + + 1234.00 + + + Meal and Entertainment + + + + + + + + + + + 2000.00 + + + Other expanses + + + + + + + + + + + 1500.00 + + \ No newline at end of file diff --git a/aws-camelk-model/src/main/resources/xsd/money-transfer.xsd b/aws-camelk-model/src/main/resources/xsd/money-transfer.xsd new file mode 100644 index 0000000..ced735e --- /dev/null +++ b/aws-camelk-model/src/main/resources/xsd/money-transfer.xsd @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aws-camelk-model/src/main/resources/xsd/money-transfers.xsd b/aws-camelk-model/src/main/resources/xsd/money-transfers.xsd new file mode 100644 index 0000000..3d42325 --- /dev/null +++ b/aws-camelk-model/src/main/resources/xsd/money-transfers.xsd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aws-camelk-model/src/test/java/fr/simplex_software/quarkus/camel/integrations/jaxb/tests/TestJaxbModel.java b/aws-camelk-model/src/test/java/fr/simplex_software/quarkus/camel/integrations/jaxb/tests/TestJaxbModel.java new file mode 100644 index 0000000..1fa7ecc --- /dev/null +++ b/aws-camelk-model/src/test/java/fr/simplex_software/quarkus/camel/integrations/jaxb/tests/TestJaxbModel.java @@ -0,0 +1,74 @@ +package fr.simplex_software.quarkus.camel.integrations.jaxb.tests; + +import fr.simplex_software.quarkus.camel.integrations.jaxb.*; +import org.junit.jupiter.api.*; + +import javax.xml.bind.*; +import java.io.*; +import java.util.*; + +import static org.assertj.core.api.Assertions.*; + +public class TestJaxbModel +{ + @Test + public void testUnmarshalMoneyTransfersFile() throws JAXBException + { + MoneyTransfers moneyTransfers = (MoneyTransfers) unmarshalXmlFile(new File("src/main/resources/xml/money-transfers.xml")); + assertThat(moneyTransfers).isNotNull(); + List moneyTransferList = moneyTransfers.getMoneyTransfers(); + assertThat(moneyTransferList).isNotNull(); + assertThat(moneyTransferList.size()).isEqualTo(5); + MoneyTransfer moneyTransfer = moneyTransferList.get(3); + assertThat(moneyTransfer.getReference()).isEqualTo("Meal and Entertainment"); + assertThat(moneyTransfer.getSourceAccount().getAccountID()).isEqualTo("SG01"); + } + + @Test + public void testUnmarshalMoneyTransferFile() throws JAXBException + { + MoneyTransfer moneyTransfer = (MoneyTransfer) unmarshalXmlFile(new File("src/main/resources/xml/money-transfer.xml")); + assertThat(moneyTransfer).isNotNull(); + assertThat(moneyTransfer.getReference()).isEqualTo("Tech Repairs"); + assertThat(moneyTransfer.getSourceAccount().getAccountID()).isEqualTo("SG01"); + } + + @Test + public void testMarshalMoneyTransfers() throws JAXBException + { + MoneyTransfers moneyTransfers = (MoneyTransfers) unmarshalXmlFile(new File("src/main/resources/xml/money-transfers.xml")); + assertThat(moneyTransfers).isNotNull(); + List moneyTransferList = moneyTransfers.getMoneyTransfers(); + assertThat(marshalMoneyTransfersToXmlFile(moneyTransfers, new File ("target/xfer.xml"))).exists(); + } + + @Test + public void testMarshalMoneyTransfer() throws JAXBException + { + MoneyTransfer moneyTransfer = (MoneyTransfer) unmarshalXmlFile(new File("src/main/resources/xml/money-transfer.xml")); + assertThat(moneyTransfer).isNotNull(); + assertThat(marshalMoneyTransfersToXmlFile(moneyTransfer, new File ("target/xfer2.xml"))).exists(); + } + + + private Object unmarshalXmlFile (File xml) throws JAXBException + { + return JAXBContext.newInstance(MoneyTransfers.class).createUnmarshaller().unmarshal(xml); + } + + + private File marshalMoneyTransfersToXmlFile(Object moneyTransfers, File xml) + { + try + { + Marshaller marshaller = JAXBContext.newInstance(moneyTransfers.getClass()).createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + marshaller.marshal(moneyTransfers, xml); + } + catch (Exception e) + { + e.printStackTrace(); + } + return xml; + } +} diff --git a/aws-camelk-provider/.gitignore b/aws-camelk-provider/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/aws-camelk-provider/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/aws-camelk-provider/pom.xml b/aws-camelk-provider/pom.xml new file mode 100644 index 0000000..9bc9d3c --- /dev/null +++ b/aws-camelk-provider/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + + aws-camelk-provider + AWS CamelK :: The Provider Module + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-api + 1.0.0-SNAPSHOT + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-model + + + + ${project.artifactId} + + + io.smallrye + jandex-maven-plugin + + + + \ No newline at end of file diff --git a/aws-camelk-provider/src/main/java/fr/simplex_software/quarkus/camel/integrations/provider/DefaultMoneyTransferProvider.java b/aws-camelk-provider/src/main/java/fr/simplex_software/quarkus/camel/integrations/provider/DefaultMoneyTransferProvider.java new file mode 100644 index 0000000..0019030 --- /dev/null +++ b/aws-camelk-provider/src/main/java/fr/simplex_software/quarkus/camel/integrations/provider/DefaultMoneyTransferProvider.java @@ -0,0 +1,47 @@ +package fr.simplex_software.quarkus.camel.integrations.provider; + +import fr.simplex_software.quarkus.camel.integrations.api.*; +import fr.simplex_software.quarkus.camel.integrations.jaxb.*; + +import javax.enterprise.context.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.*; + +@ApplicationScoped +public class DefaultMoneyTransferProvider implements MoneyTransferFacade +{ + private Map moneyTransferMap = new ConcurrentHashMap<>(); + + @Override + public List getMoneyTransferOrders() + { + return moneyTransferMap.entrySet().stream().map(es -> es.getValue()).collect(Collectors.toList()); + } + + @Override + public Optional getMoneyTransferOrder(String reference) + { + return Optional.ofNullable(moneyTransferMap.get(reference)); + } + + @Override + public String createMoneyTransferOrder(MoneyTransfer moneyTransfer) + { + String ref = moneyTransfer.getReference(); + moneyTransferMap.put(ref, moneyTransfer); + return ref; + } + + @Override + public void updateMoneyTransferOrder(String ref, MoneyTransfer moneyTransfer) + { + moneyTransferMap.put(ref, moneyTransfer); + } + + @Override + public void deleteMoneyTransferOrder(String ref) + { + moneyTransferMap.remove(ref); + } +} diff --git a/aws-camelk-s3/.gitignore b/aws-camelk-s3/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/aws-camelk-s3/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/aws-camelk-s3/pom.xml b/aws-camelk-s3/pom.xml new file mode 100644 index 0000000..02b4f19 --- /dev/null +++ b/aws-camelk-s3/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + + aws-camelk-s3 + AWS CamelK :: The S3 to SQS Module + + + org.apache.camel.quarkus + camel-quarkus-aws2-s3 + + + org.apache.camel.quarkus + camel-quarkus-aws2-sqs + + + com.amazonaws + aws-java-sdk-s3 + + + com.amazonaws + aws-java-sdk-sqs + + + + ${project.artifactId} + + + io.quarkus.platform + quarkus-maven-plugin + + + + \ No newline at end of file diff --git a/aws-camelk-s3/src/main/java/fr/simplex_software/quarkus/camel/integrations/s3/S3ToSqsRoute.java b/aws-camelk-s3/src/main/java/fr/simplex_software/quarkus/camel/integrations/s3/S3ToSqsRoute.java new file mode 100644 index 0000000..546ad95 --- /dev/null +++ b/aws-camelk-s3/src/main/java/fr/simplex_software/quarkus/camel/integrations/s3/S3ToSqsRoute.java @@ -0,0 +1,43 @@ +package fr.simplex_software.quarkus.camel.integrations.s3; + +import com.amazonaws.services.s3.*; +import com.amazonaws.services.s3.model.*; +import org.apache.camel.builder.*; +import org.eclipse.microprofile.config.inject.*; + +import javax.enterprise.context.*; +import java.util.*; + +import static org.apache.camel.builder.endpoint.StaticEndpointBuilders.*; + +@ApplicationScoped +public class S3ToSqsRoute extends RouteBuilder +{ + private static final String RANDOM = new Random().ints('a', 'z') + .limit(5) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + @ConfigProperty(name="illegal-state-exception-msg") + String illegalStateExceptionMsg; + @ConfigProperty(name="sqs-queue-name") + String queueName; + public String s3BucketName; + + public S3ToSqsRoute () throws InterruptedException + { + AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard().build(); + Optional optionalBucket = amazonS3.listBuckets().stream().filter(b -> b.getName().startsWith("mys3")).findFirst(); + if (optionalBucket.isPresent()) + this.s3BucketName = optionalBucket.get().getName(); + else + this.s3BucketName = amazonS3.createBucket("mys3" + RANDOM).getName(); + } + + @Override + public void configure() + { + from(aws2S3(s3BucketName).useDefaultCredentialsProvider(true)) + .split().tokenizeXML("moneyTransfer").streaming() + .to(aws2Sqs(queueName).autoCreateQueue(true).useDefaultCredentialsProvider(true).region("eu-west-3")); + } +} diff --git a/aws-camelk-s3/src/main/resources/application.properties b/aws-camelk-s3/src/main/resources/application.properties new file mode 100644 index 0000000..c92e14f --- /dev/null +++ b/aws-camelk-s3/src/main/resources/application.properties @@ -0,0 +1,2 @@ +illegal-state-exception-msg="### S3ToSqsRoute.getS3BucketName(): Cannot find S3 bucket having a name which starts with \"mys3\"" +sqs-queue-name=myQueue \ No newline at end of file diff --git a/aws-camelk-s3/src/test/java/fr/simplex_software/quarkus/camel/integrations/s3/tests/TestS3ToSqsRoute.java b/aws-camelk-s3/src/test/java/fr/simplex_software/quarkus/camel/integrations/s3/tests/TestS3ToSqsRoute.java new file mode 100644 index 0000000..dfb224e --- /dev/null +++ b/aws-camelk-s3/src/test/java/fr/simplex_software/quarkus/camel/integrations/s3/tests/TestS3ToSqsRoute.java @@ -0,0 +1,66 @@ +package fr.simplex_software.quarkus.camel.integrations.s3.tests; + +import com.amazonaws.services.sqs.*; +import com.amazonaws.services.sqs.model.Message; +import fr.simplex_software.quarkus.camel.integrations.s3.*; +import io.quarkus.test.junit.*; +import org.apache.camel.*; +import org.apache.camel.component.aws2.s3.*; +import org.eclipse.microprofile.config.inject.*; +import org.junit.jupiter.api.*; + +import javax.inject.*; +import java.util.*; + +import static org.assertj.core.api.Assertions.*; + +@QuarkusTest +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class TestS3ToSqsRoute +{ + @Inject + ProducerTemplate producer; + @ConfigProperty(name = "sqs-queue-name") + String queueName; + private final AmazonSQS amazonSqsClient = AmazonSQSClientBuilder.defaultClient(); + @Inject + CamelContext camelContext; + @Inject + S3ToSqsRoute s3ToSqsRoute; + private static final String BODY = ""; + private static final String ENDPOINT_URI = "aws2-s3://%s?useDefaultCredentialsProvider=true"; + + @BeforeAll + public void beforeAll() throws Exception + { + camelContext.addRoutes(s3ToSqsRoute); + camelContext.start(); + } + + @AfterAll + public void afterAll() + { + camelContext.stop(); + } + + @Test + public void testSendMessageToSQS() throws Exception + { + producer.sendBodyAndHeader(String.format(ENDPOINT_URI, s3ToSqsRoute.s3BucketName), BODY, AWS2S3Constants.KEY, "test.xml"); + Thread.sleep(2000); + String queueUrl = amazonSqsClient.getQueueUrl(queueName).getQueueUrl(); + assertThat(queueUrl).isNotNull(); + List messages = amazonSqsClient.receiveMessage(queueUrl).getMessages(); + assertThat(messages).isNotNull(); + assertThat(messages.size()).isGreaterThan(0); + messages.forEach(msg -> + { + assertThat(msg).isNotNull(); + assertThat(msg.getBody()).isEqualTo(BODY); + amazonSqsClient.deleteMessage(queueUrl, msg.getReceiptHandle()); + }); + messages = amazonSqsClient.receiveMessage(queueUrl).getMessages(); + assertThat(messages).hasSize(0); + amazonSqsClient.deleteQueue(queueUrl); + } +} diff --git a/aws-camelk-sqs/.gitignore b/aws-camelk-sqs/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/aws-camelk-sqs/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/aws-camelk-sqs/pom.xml b/aws-camelk-sqs/pom.xml new file mode 100644 index 0000000..7a15bdc --- /dev/null +++ b/aws-camelk-sqs/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + + aws-camelk-sqs + AWS CamelK :: The SQS to REST Module + + + io.quarkus + quarkus-jaxb + + + org.apache.camel.quarkus + camel-quarkus-aws2-sqs + + + org.apache.camel.quarkus + camel-quarkus-http + + + org.apache.camel.quarkus + camel-quarkus-jaxb + + + org.apache.camel.quarkus + camel-quarkus-bean + + + org.apache.camel.quarkus + camel-quarkus-jsonb + + + com.amazonaws + aws-java-sdk-sqs + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-model + + + + ${project.artifactId} + + + io.quarkus.platform + quarkus-maven-plugin + + + + \ No newline at end of file diff --git a/aws-camelk-sqs/src/main/java/fr/simplex_software/quarkus/camel/integrations/sqs/SqsToJaxRsRoute.java b/aws-camelk-sqs/src/main/java/fr/simplex_software/quarkus/camel/integrations/sqs/SqsToJaxRsRoute.java new file mode 100644 index 0000000..37b3dd6 --- /dev/null +++ b/aws-camelk-sqs/src/main/java/fr/simplex_software/quarkus/camel/integrations/sqs/SqsToJaxRsRoute.java @@ -0,0 +1,38 @@ +package fr.simplex_software.quarkus.camel.integrations.sqs; + +import fr.simplex_software.quarkus.camel.integrations.jaxb.*; +import org.apache.camel.*; +import org.apache.camel.builder.*; +import org.apache.camel.model.dataformat.*; +import org.eclipse.microprofile.config.inject.*; + +import javax.annotation.*; +import javax.enterprise.context.*; + +import static org.apache.camel.builder.endpoint.StaticEndpointBuilders.*; + +@ApplicationScoped +public class SqsToJaxRsRoute extends RouteBuilder +{ + @ConfigProperty(name="sqs-queue-name") + String queueName; + @ConfigProperty(name="rest-uri") + String uri; + private JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(true); + + @PostConstruct + public void postConstruct() + { + jaxbDataFormat.setContextPath(MoneyTransfer.class.getPackageName()); + } + + @Override + public void configure() throws Exception + { + from(aws2Sqs(queueName).useDefaultCredentialsProvider(true).region("eu-west-3")) + .unmarshal(jaxbDataFormat) + .marshal().json(JsonLibrary.Jsonb) + .setHeader(Exchange.HTTP_METHOD, constant("POST")) + .to(http(uri)); + } +} diff --git a/aws-camelk-sqs/src/main/resources/application.properties b/aws-camelk-sqs/src/main/resources/application.properties new file mode 100644 index 0000000..18f6bb3 --- /dev/null +++ b/aws-camelk-sqs/src/main/resources/application.properties @@ -0,0 +1,2 @@ +sqs-queue-name=myQueue +rest-uri=localhost:8080/xfer \ No newline at end of file diff --git a/copy-xml-file.sh b/copy-xml-file.sh new file mode 100644 index 0000000..aff0585 --- /dev/null +++ b/copy-xml-file.sh @@ -0,0 +1,2 @@ +#!/bin/sh +cp aws-camelk-model/src/main/resources/xml/money-transfers.xml tmp/input \ No newline at end of file diff --git a/create-queue.sh b/create-queue.sh new file mode 100644 index 0000000..265e7ac --- /dev/null +++ b/create-queue.sh @@ -0,0 +1,9 @@ +#!/bin/bash +REGION=$(aws configure get region) +QUEUE_LIST=$(aws sqs list-queues --queue-name-prefix myQueue --region $REGION --query "QueueUrls[0]" --output text) +if [ $QUEUE_LIST = None ] +then + aws sqs create-queue --queue-name myQueue --region $REGION +else + aws sqs purge-queue --queue-url $QUEUE_LIST --region $REGION +fi diff --git a/delete-all-buckets.sh b/delete-all-buckets.sh new file mode 100644 index 0000000..4e19f66 --- /dev/null +++ b/delete-all-buckets.sh @@ -0,0 +1,2 @@ +#!/bin/sh +aws s3 ls | cut -d" " -f 3 | xargs -I{} aws s3 rb s3://{} --force \ No newline at end of file diff --git a/delete-sqs-queue.sh b/delete-sqs-queue.sh new file mode 100644 index 0000000..e87bf11 --- /dev/null +++ b/delete-sqs-queue.sh @@ -0,0 +1 @@ +aws sqs delete-queue --queue-url https://sqs.eu-west-3.amazonaws.com/495913029085/myQueue \ No newline at end of file diff --git a/kill-ms.sh b/kill-ms.sh new file mode 100644 index 0000000..9675f44 --- /dev/null +++ b/kill-ms.sh @@ -0,0 +1,6 @@ +#!/bin/sh +kill $(cat pid-aws-camelk-file.pid) +kill $(cat pid-aws-camelk-jaxrs.pid) +kill $(cat pid-aws-camelk-sqs.pid) +kill $(cat pid-aws-camelk-s3.pid) + diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..8d937f4 --- /dev/null +++ b/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..c4586b5 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pid-aws-camelk-s3 b/pid-aws-camelk-s3 new file mode 100644 index 0000000..c6fdb28 --- /dev/null +++ b/pid-aws-camelk-s3 @@ -0,0 +1 @@ +17466 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f3e76d1 --- /dev/null +++ b/pom.xml @@ -0,0 +1,164 @@ + + + 4.0.0 + fr.simplex-software.quarkus.camel.integrations + aws-camelk + 1.0.0-SNAPSHOT + pom + AWS CamelK the Master POM + + aws-camelk-model + aws-camelk-file + aws-camelk-s3 + aws-camelk-sqs + aws-camelk-provider + aws-camelk-jaxrs + aws-camelk-api + + + 11 + 11 + 11 + 11 + UTF-8 + UTF-8 + 2.16.6.Final + true + 3.0.0 + + + + + io.quarkus.platform + quarkus-bom + ${quarkus.platform.version} + pom + import + + + io.quarkus.platform + quarkus-camel-bom + ${quarkus.platform.version} + pom + import + + + com.amazonaws + aws-java-sdk-bom + 1.12.454 + pom + import + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-model + 1.0.0-SNAPSHOT + + + fr.simplex-software.quarkus.camel.integrations + aws-camelk-provider + 1.0.0-SNAPSHOT + + + + + + io.quarkus + quarkus-arc + + + org.apache.camel.quarkus + camel-quarkus-core + + + org.apache.camel.quarkus + camel-quarkus-log + + + commons-logging + commons-logging + 1.2 + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + org.assertj + assertj-core + 3.23.1 + test + + + + + + + io.quarkus.platform + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + + + + + + + io.smallrye + jandex-maven-plugin + 3.0.5 + + + make-index + + jandex + + + + + + + + diff --git a/purge-sqs-queue.sh b/purge-sqs-queue.sh new file mode 100644 index 0000000..2ee8a5f --- /dev/null +++ b/purge-sqs-queue.sh @@ -0,0 +1 @@ +aws sqs purge-queue --queue-url https://sqs.eu-west-3.amazonaws.com/495913029085/myQueue diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm new file mode 100644 index 0000000..dc889bf --- /dev/null +++ b/src/main/docker/Dockerfile.jvm @@ -0,0 +1,95 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/code-with-quarkus-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-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. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-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 +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 0000000..0d4ff83 --- /dev/null +++ b/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,91 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package -Dquarkus.package.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/code-with-quarkus-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-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. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus-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 +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 + +ENV LANGUAGE='en_US:en' + + +COPY target/lib/* /deployments/lib/ +COPY target/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" diff --git a/src/main/docker/Dockerfile.native b/src/main/docker/Dockerfile.native new file mode 100644 index 0000000..4e076cf --- /dev/null +++ b/src/main/docker/Dockerfile.native @@ -0,0 +1,27 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./mvnw package -Pnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/code-with-quarkus . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.6 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/docker/Dockerfile.native-micro b/src/main/docker/Dockerfile.native-micro new file mode 100644 index 0000000..40afb1a --- /dev/null +++ b/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,30 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./mvnw package -Pnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/code-with-quarkus . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus +# +### +FROM quay.io/quarkus/quarkus-micro-image:2.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/java/org/acme/ExampleResource.java b/src/main/java/org/acme/ExampleResource.java new file mode 100644 index 0000000..e8aad59 --- /dev/null +++ b/src/main/java/org/acme/ExampleResource.java @@ -0,0 +1,16 @@ +package org.acme; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/hello") +public class ExampleResource { + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String hello() { + return "Hello from RESTEasy Reactive"; + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/resources/index.html b/src/main/resources/META-INF/resources/index.html new file mode 100644 index 0000000..760fe03 --- /dev/null +++ b/src/main/resources/META-INF/resources/index.html @@ -0,0 +1,280 @@ + + + + + code-with-quarkus - 1.0.0-SNAPSHOT + + + +
+
+
+ + + + + quarkus_logo_horizontal_rgb_1280px_reverse + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+

You just made a Quarkus application.

+

This page is served by Quarkus.

+ Visit the Dev UI +

This page: src/main/resources/META-INF/resources/index.html

+

App configuration: src/main/resources/application.properties

+

Static assets: src/main/resources/META-INF/resources/

+

Code: src/main/java

+

Dev UI V1: /q/dev-v1

+

Generated starter code:

+
    +
  • + RESTEasy Reactive Easily start your Reactive RESTful Web Services +
    @Path: /hello +
    Related guide +
  • + +
+
+
+
Documentation
+

Practical step-by-step guides to help you achieve a specific goal. Use them to help get your work + done.

+
Set up your IDE
+

Everyone has a favorite IDE they like to use to code. Learn how to configure yours to maximize your + Quarkus productivity.

+
+
+
+ + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/test/java/org/acme/ExampleResourceIT.java b/src/test/java/org/acme/ExampleResourceIT.java new file mode 100644 index 0000000..5ec9b52 --- /dev/null +++ b/src/test/java/org/acme/ExampleResourceIT.java @@ -0,0 +1,8 @@ +package org.acme; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class ExampleResourceIT extends ExampleResourceTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/test/java/org/acme/ExampleResourceTest.java b/src/test/java/org/acme/ExampleResourceTest.java new file mode 100644 index 0000000..9fae14b --- /dev/null +++ b/src/test/java/org/acme/ExampleResourceTest.java @@ -0,0 +1,21 @@ +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 +public class ExampleResourceTest { + + @Test + public void testHelloEndpoint() { + given() + .when().get("/hello") + .then() + .statusCode(200) + .body(is("Hello from RESTEasy Reactive")); + } + +} \ No newline at end of file diff --git a/start-ms.sh b/start-ms.sh new file mode 100644 index 0000000..e1c1f06 --- /dev/null +++ b/start-ms.sh @@ -0,0 +1,17 @@ +#!/bin/sh +./delete-all-buckets.sh +./create-queue.sh +java -jar ./aws-camelk-file/target/quarkus-app/quarkus-run.jar & +sleep 3 +java -jar ./aws-camelk-s3/target/quarkus-app/quarkus-run.jar & +sleep 3 +java -jar ./aws-camelk-jaxrs/target/quarkus-app/quarkus-run.jar & +sleep 3 +java -jar ./aws-camelk-sqs/target/quarkus-app/quarkus-run.jar & +sleep 3 +ps ef | grep -i aws-camelk-file | grep -v grep | awk {'print $1'} > pid-aws-camelk-file.pid +ps ef | grep -i aws-camelk-s3 | grep -v grep | awk {'print $1'} > pid-aws-camelk-s3.pid +ps ef | grep -i aws-camelk-jaxrs | grep -v grep | awk {'print $1'} > pid-aws-camelk-jaxrs.pid +ps ef | grep -i aws-camelk-sqs | grep -v grep | awk {'print $1'} > pid-aws-camelk-sqs.pid +./copy-xml-file.sh +