初始化项目

This commit is contained in:
1445458000@qq.com 2025-02-24 16:30:52 +08:00
commit 0a19aa1611
60 changed files with 2962 additions and 0 deletions

5
.dockerignore Normal file
View File

@ -0,0 +1,5 @@
*
!target/*-runner
!target/*-runner.jar
!target/lib/*
!target/quarkus-app/*

26
.gitignore vendored Normal file
View File

@ -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

1
.mvn/wrapper/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
maven-wrapper.jar

View File

@ -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 );
}
}
}

18
.mvn/wrapper/maven-wrapper.properties vendored Normal file
View File

@ -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

40
README.md Normal file
View File

@ -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

38
aws-camelk-api/.gitignore vendored Normal file
View File

@ -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

28
aws-camelk-api/pom.xml Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>aws-camelk-api</artifactId>
<name>AWS CamelK :: The API Module</name>
<dependencies>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-model</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>io.smallrye</groupId>
<artifactId>jandex-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -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<MoneyTransfer> getMoneyTransferOrders();
Optional<MoneyTransfer> getMoneyTransferOrder(String reference);
String createMoneyTransferOrder(MoneyTransfer moneyTransfer);
void updateMoneyTransferOrder(String ref, MoneyTransfer moneyTransfer);
void deleteMoneyTransferOrder(String ref);
}

38
aws-camelk-file/.gitignore vendored Normal file
View File

@ -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

48
aws-camelk-file/pom.xml Normal file
View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>aws-camelk-file</artifactId>
<name>AWS CamelK :: The File to S3 Module</name>
<dependencies>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-file</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-aws2-s3</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-validator</artifactId>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-model</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>io.quarkus.platform</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -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();
}
}

View File

@ -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"

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.simplex-software.fr/money-transfer" xmlns:ss="http://www.simplex-software.fr/money-transfer"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:extensionBindingPrefixes="xjc"
jaxb:version="1.0" elementFormDefault="qualified">
<!--annotation>
<appinfo>
<jaxb:globalBindings>
<xjc:simple/>
</jaxb:globalBindings>
<jaxb:serializable/>
</appinfo>
</annotation-->
<simpleType name="BankAccountType" final="restriction">
<restriction base="string">
<enumeration value="SAVINGS" />
<enumeration value="CHECKING" />
</restriction>
</simpleType>
<complexType name="BankAddress">
<attribute name="streetName" type="string" />
<attribute name="streetNumber" type="string" />
<attribute name="poBox" type="string" />
<attribute name="cityName" type="string" />
<attribute name="zipCode" type="string" />
<attribute name="countryName" type="string" />
</complexType>
<complexType name="Bank">
<sequence>
<element name="bankAddresses" type="ss:BankAddress" maxOccurs="unbounded"/>
</sequence>
<attribute name="bankName" type="string"/>
</complexType>
<complexType name="BankAccount">
<sequence>
<element name="bank" type="ss:Bank"/>
</sequence>
<attribute name="accountID" type="string" />
<attribute name="accountType" type="ss:BankAccountType" />
<attribute name="sortCode" type="string" />
<attribute name="accountNumber" type="string" />
<attribute name="transCode" type="string" />
</complexType>
<complexType name="MoneyTransfer">
<sequence>
<element name="reference" type="string"/>
<element name="sourceAccount" type="ss:BankAccount"/>
<element name="targetAccount" type="ss:BankAccount"/>
<element name="amount" type="decimal" minOccurs="1" />
</sequence>
</complexType>
<element name="moneyTransfer" type="ss:MoneyTransfer"/>
</schema>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.simplex-software.fr/money-transfer" xmlns:ss="http://www.simplex-software.fr/money-transfer"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:extensionBindingPrefixes="xjc"
jaxb:version="1.0" elementFormDefault="qualified">
<include schemaLocation="money-transfer.xsd"/>
<annotation>
<appinfo>
<jaxb:globalBindings>
<xjc:simple/>
</jaxb:globalBindings>
<jaxb:serializable/>
</appinfo>
</annotation>
<complexType name="MoneyTransfers">
<sequence>
<element name="moneyTransfer" type="ss:MoneyTransfer" maxOccurs="unbounded" minOccurs="1"/>
</sequence>
</complexType>
<element name="moneyTransfers" type="ss:MoneyTransfers"/>
</schema>

View File

@ -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<Bucket> 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);
}
}

View File

@ -0,0 +1 @@
Test

38
aws-camelk-jaxrs/.gitignore vendored Normal file
View File

@ -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

53
aws-camelk-jaxrs/pom.xml Normal file
View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>aws-camelk-jaxrs</artifactId>
<name>AWS CamelK :: The JAX-RS Module</name>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-openapi</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-metrics</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-fault-tolerance</artifactId>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-provider</artifactId>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-model</artifactId>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>io.quarkus.platform</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -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<List<MoneyTransfer>> 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();
}
}

View File

@ -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<MoneyTransfer> moneyTransfers = response.as(new TypeRef<List<MoneyTransfer>>() {});
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()));
}
}

38
aws-camelk-model/.gitignore vendored Normal file
View File

@ -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

53
aws-camelk-model/pom.xml Normal file
View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<name>AWS CamelK :: The Model Module</name>
<artifactId>aws-camelk-model</artifactId>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jaxb</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-value-constructor</artifactId>
<version>3.0</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<packageName>fr.simplex_software.quarkus.camel.integrations.jaxb</packageName>
<sources>
<source>${basedir}/src/main/resources/xsd</source>
</sources>
<arguments>
<argument>-Xvalue-constructor</argument>
</arguments>
<extension>true</extension>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,16 @@
<mon:moneyTransfer xmlns:mon="http://www.simplex-software.fr/money-transfer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.simplex-software.fr/money-transfer ../xsd/money-transfer.xsd">
<mon:reference>Tech Repairs</mon:reference>
<mon:sourceAccount accountID="SG01" accountType="CHECKING" sortCode="04004" accountNumber="00050525712" transCode="03000">
<mon:bank bankName="Société Générale">
<mon:bankAddresses streetName="av. de Paris" streetNumber="18" poBox="Cedex" cityName="Montmorency" zipCode="95800" countryName="France"/>
</mon:bank>
</mon:sourceAccount>
<mon:targetAccount accountID="ING01" accountType="SAVINGS" sortCode="08080" accountNumber="425091789" transCode="7BRE0">
<mon:bank bankName="ING">
<mon:bankAddresses streetName="blvd. Waterloo" streetNumber="381" poBox="INGPOBOX" cityName="Waterloo" zipCode="B1000" countryName="Belgium"/>
</mon:bank>
</mon:targetAccount>
<mon:amount>1000.00</mon:amount>
</mon:moneyTransfer>

View File

@ -0,0 +1,74 @@
<moneyTransfers xmlns="http://www.simplex-software.fr/money-transfer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.simplex-software.fr/money-transfer ../xsd/money-transfers.xsd">
<moneyTransfer xmlns="http://www.simplex-software.fr/money-transfer">
<reference>Tech Repairs</reference>
<sourceAccount accountID="SG01" accountType="CHECKING" sortCode="04004" accountNumber="00050525712" transCode="03000">
<bank bankName="Société Générale">
<bankAddresses streetName="av. de Paris" streetNumber="18" poBox="Cedex" cityName="Montmorency" zipCode="95800" countryName="France"/>
</bank>
</sourceAccount>
<targetAccount accountID="ING01" accountType="SAVINGS" sortCode="08080" accountNumber="425091789" transCode="7BRE0">
<bank bankName="ING">
<bankAddresses streetName="blvd. Waterloo" streetNumber="381" poBox="INGPOBOX" cityName="Waterloo" zipCode="B1000" countryName="Belgium"/>
</bank>
</targetAccount>
<amount>1000.00</amount>
</moneyTransfer>
<moneyTransfer xmlns="http://www.simplex-software.fr/money-transfer">
<reference>Taxes and Licences</reference>
<sourceAccount accountID="SG01" accountType="CHECKING" sortCode="04004" accountNumber="00050525712" transCode="03000">
<bank bankName="Société Générale">
<bankAddresses streetName="av. de Paris" streetNumber="18" poBox="Cedex" cityName="Montmorency" zipCode="95800" countryName="France"/>
</bank>
</sourceAccount>
<targetAccount accountID="ING01" accountType="SAVINGS" sortCode="08080" accountNumber="425091789" transCode="7BRE0">
<bank bankName="ING">
<bankAddresses streetName="blvd. Waterloo" streetNumber="381" poBox="INGPOBOX" cityName="Waterloo" zipCode="B1000" countryName="Belgium"/>
</bank>
</targetAccount>
<amount>800.00</amount>
</moneyTransfer>
<moneyTransfer xmlns="http://www.simplex-software.fr/money-transfer">
<reference>Advertising</reference>
<sourceAccount accountID="SG01" accountType="CHECKING" sortCode="04004" accountNumber="00050525712" transCode="03000">
<bank bankName="Société Générale">
<bankAddresses streetName="av. de Paris" streetNumber="18" poBox="Cedex" cityName="Montmorency" zipCode="95800" countryName="France"/>
</bank>
</sourceAccount>
<targetAccount accountID="ING01" accountType="SAVINGS" sortCode="08080" accountNumber="425091789" transCode="7BRE0">
<bank bankName="ING">
<bankAddresses streetName="blvd. Waterloo" streetNumber="381" poBox="INGPOBOX" cityName="Waterloo" zipCode="B1000" countryName="Belgium"/>
</bank>
</targetAccount>
<amount>1234.00</amount>
</moneyTransfer>
<moneyTransfer xmlns="http://www.simplex-software.fr/money-transfer">
<reference>Meal and Entertainment</reference>
<sourceAccount accountID="SG01" accountType="CHECKING" sortCode="04004" accountNumber="00050525712" transCode="03000">
<bank bankName="Société Générale">
<bankAddresses streetName="av. de Paris" streetNumber="18" poBox="Cedex" cityName="Montmorency" zipCode="95800" countryName="France"/>
</bank>
</sourceAccount>
<targetAccount accountID="ING01" accountType="SAVINGS" sortCode="08080" accountNumber="425091789" transCode="7BRE0">
<bank bankName="ING">
<bankAddresses streetName="blvd. Waterloo" streetNumber="381" poBox="INGPOBOX" cityName="Waterloo" zipCode="B1000" countryName="Belgium"/>
</bank>
</targetAccount>
<amount>2000.00</amount>
</moneyTransfer>
<moneyTransfer xmlns="http://www.simplex-software.fr/money-transfer">
<reference>Other expanses</reference>
<sourceAccount accountID="SG01" accountType="CHECKING" sortCode="04004" accountNumber="00050525712" transCode="03000">
<bank bankName="Société Générale">
<bankAddresses streetName="av. de Paris" streetNumber="18" poBox="Cedex" cityName="Montmorency" zipCode="95800" countryName="France"/>
</bank>
</sourceAccount>
<targetAccount accountID="ING01" accountType="SAVINGS" sortCode="08080" accountNumber="425091789" transCode="7BRE0">
<bank bankName="ING">
<bankAddresses streetName="blvd. Waterloo" streetNumber="381" poBox="INGPOBOX" cityName="Waterloo" zipCode="B1000" countryName="Belgium"/>
</bank>
</targetAccount>
<amount>1500.00</amount>
</moneyTransfer>
</moneyTransfers>

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.simplex-software.fr/money-transfer" xmlns:ss="http://www.simplex-software.fr/money-transfer"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:extensionBindingPrefixes="xjc"
jaxb:version="1.0" elementFormDefault="qualified">
<simpleType name="BankAccountType" final="restriction">
<restriction base="string">
<enumeration value="SAVINGS" />
<enumeration value="CHECKING" />
</restriction>
</simpleType>
<complexType name="BankAddress">
<attribute name="streetName" type="string" />
<attribute name="streetNumber" type="string" />
<attribute name="poBox" type="string" />
<attribute name="cityName" type="string" />
<attribute name="zipCode" type="string" />
<attribute name="countryName" type="string" />
</complexType>
<complexType name="Bank">
<sequence>
<element name="bankAddresses" type="ss:BankAddress" maxOccurs="unbounded"/>
</sequence>
<attribute name="bankName" type="string"/>
</complexType>
<complexType name="BankAccount">
<sequence>
<element name="bank" type="ss:Bank"/>
</sequence>
<attribute name="accountID" type="string" />
<attribute name="accountType" type="ss:BankAccountType" />
<attribute name="sortCode" type="string" />
<attribute name="accountNumber" type="string" />
<attribute name="transCode" type="string" />
</complexType>
<complexType name="MoneyTransfer">
<sequence>
<element name="reference" type="string"/>
<element name="sourceAccount" type="ss:BankAccount"/>
<element name="targetAccount" type="ss:BankAccount"/>
<element name="amount" type="decimal" minOccurs="1" />
</sequence>
</complexType>
<element name="moneyTransfer" type="ss:MoneyTransfer"/>
</schema>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.simplex-software.fr/money-transfer" xmlns:ss="http://www.simplex-software.fr/money-transfer"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:extensionBindingPrefixes="xjc"
jaxb:version="1.0" elementFormDefault="qualified">
<include schemaLocation="money-transfer.xsd"/>
<annotation>
<appinfo>
<jaxb:globalBindings>
<xjc:simple/>
</jaxb:globalBindings>
<jaxb:serializable/>
</appinfo>
</annotation>
<complexType name="MoneyTransfers">
<sequence>
<element name="moneyTransfer" type="ss:MoneyTransfer" maxOccurs="unbounded" minOccurs="1"/>
</sequence>
</complexType>
<element name="moneyTransfers" type="ss:MoneyTransfers"/>
</schema>

View File

@ -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<MoneyTransfer> 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<MoneyTransfer> 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;
}
}

38
aws-camelk-provider/.gitignore vendored Normal file
View File

@ -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

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>aws-camelk-provider</artifactId>
<name>AWS CamelK :: The Provider Module</name>
<dependencies>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-model</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>io.smallrye</groupId>
<artifactId>jandex-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -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<String, MoneyTransfer> moneyTransferMap = new ConcurrentHashMap<>();
@Override
public List<MoneyTransfer> getMoneyTransferOrders()
{
return moneyTransferMap.entrySet().stream().map(es -> es.getValue()).collect(Collectors.toList());
}
@Override
public Optional<MoneyTransfer> 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);
}
}

38
aws-camelk-s3/.gitignore vendored Normal file
View File

@ -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

40
aws-camelk-s3/pom.xml Normal file
View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>aws-camelk-s3</artifactId>
<name>AWS CamelK :: The S3 to SQS Module</name>
<dependencies>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-aws2-s3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-aws2-sqs</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sqs</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>io.quarkus.platform</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -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<Bucket> 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"));
}
}

View File

@ -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

View File

@ -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 = "<moneyTransfer/>";
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<Message> 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);
}
}

38
aws-camelk-sqs/.gitignore vendored Normal file
View File

@ -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

56
aws-camelk-sqs/pom.xml Normal file
View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>aws-camelk-sqs</artifactId>
<name>AWS CamelK :: The SQS to REST Module</name>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jaxb</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-aws2-sqs</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-http</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-jaxb</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-bean</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-jsonb</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sqs</artifactId>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-model</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>io.quarkus.platform</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -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));
}
}

View File

@ -0,0 +1,2 @@
sqs-queue-name=myQueue
rest-uri=localhost:8080/xfer

2
copy-xml-file.sh Normal file
View File

@ -0,0 +1,2 @@
#!/bin/sh
cp aws-camelk-model/src/main/resources/xml/money-transfers.xml tmp/input

9
create-queue.sh Normal file
View File

@ -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

2
delete-all-buckets.sh Normal file
View File

@ -0,0 +1,2 @@
#!/bin/sh
aws s3 ls | cut -d" " -f 3 | xargs -I{} aws s3 rb s3://{} --force

1
delete-sqs-queue.sh Normal file
View File

@ -0,0 +1 @@
aws sqs delete-queue --queue-url https://sqs.eu-west-3.amazonaws.com/495913029085/myQueue

6
kill-ms.sh Normal file
View File

@ -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)

308
mvnw vendored Normal file
View File

@ -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 "$@"

205
mvnw.cmd vendored Normal file
View File

@ -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%

1
pid-aws-camelk-s3 Normal file
View File

@ -0,0 +1 @@
17466

164
pom.xml Normal file
View File

@ -0,0 +1,164 @@
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>AWS CamelK the Master POM</name>
<modules>
<module>aws-camelk-model</module>
<module>aws-camelk-file</module>
<module>aws-camelk-s3</module>
<module>aws-camelk-sqs</module>
<module>aws-camelk-provider</module>
<module>aws-camelk-jaxrs</module>
<module>aws-camelk-api</module>
</modules>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.release>11</maven.compiler.release>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.version>2.16.6.Final</quarkus.platform.version>
<skipITs>true</skipITs>
<surefire-plugin.version>3.0.0</surefire-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus.platform</groupId>
<artifactId>quarkus-bom</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.quarkus.platform</groupId>
<artifactId>quarkus-camel-bom</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-bom</artifactId>
<version>1.12.454</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>fr.simplex-software.quarkus.camel.integrations</groupId>
<artifactId>aws-camelk-provider</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-log</artifactId>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.23.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>io.quarkus.platform</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.smallrye</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>3.0.5</version>
<executions>
<execution>
<id>make-index</id>
<goals>
<goal>jandex</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

1
purge-sqs-queue.sh Normal file
View File

@ -0,0 +1 @@
aws sqs purge-queue --queue-url https://sqs.eu-west-3.amazonaws.com/495913029085/myQueue

View File

@ -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"

View File

@ -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"

View File

@ -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"]

View File

@ -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"]

View File

@ -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";
}
}

File diff suppressed because one or more lines are too long

View File

@ -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.
}

View File

@ -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"));
}
}

17
start-ms.sh Normal file
View File

@ -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