This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot-examples.git
The following commit(s) were added to refs/heads/main by this push:
new 9360109 [CAMEL-17614]Be able to run infinispan spring-boot example
out of the box (#49)
9360109 is described below
commit 9360109606756ac098dd1609ef0f1ef8e07355a1
Author: Freeman(Yue) Fang <[email protected]>
AuthorDate: Wed Feb 9 03:51:32 2022 -0500
[CAMEL-17614]Be able to run infinispan spring-boot example out of the box
(#49)
---
infinispan/README.adoc | 2 +-
infinispan/pom.xml | 5 +
.../example/springboot/infinispan/Application.java | 106 ++++++++++++++++++++-
.../infinispan/CamelInfinispanRoute.java | 4 +-
infinispan/src/main/resources/infinispan.xml | 72 ++++++++++++++
5 files changed, 185 insertions(+), 4 deletions(-)
diff --git a/infinispan/README.adoc b/infinispan/README.adoc
index cbc1aec..776b52f 100644
--- a/infinispan/README.adoc
+++ b/infinispan/README.adoc
@@ -3,7 +3,7 @@
=== Introduction
This example demonstrates how you can use Camel-Infinispan Starter component.
The example is really simple: put a key/value pair in a remote cache and get
the same key.
-You'll need a running Infinispan server to run this example.
+This example starts an Infinispan server with Infinispan Docker Image, so it
can run OOTB.
=== Build
diff --git a/infinispan/pom.xml b/infinispan/pom.xml
index 2ec42ea..fe55e02 100644
--- a/infinispan/pom.xml
+++ b/infinispan/pom.xml
@@ -67,6 +67,11 @@
<artifactId>camel-infinispan-starter</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.testcontainers</groupId>
+ <artifactId>testcontainers</artifactId>
+ </dependency>
+
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
diff --git
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
index b6c8e90..cfb9387 100644
---
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
+++
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
@@ -16,19 +16,123 @@
*/
package org.apache.camel.example.springboot.infinispan;
+import java.util.Properties;
+import java.util.function.Consumer;
+
+import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.PortBinding;
+import com.github.dockerjava.api.model.Ports;
+
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent;
+import
org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration;
+import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
+import org.infinispan.configuration.cache.CacheMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.output.OutputFrame;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.shaded.org.apache.commons.lang.SystemUtils;
+
// CHECKSTYLE:OFF
@SpringBootApplication
public class Application {
-
+
+
+ private static final Logger LOG =
LoggerFactory.getLogger(Application.class);
+
+ private static final String CONTAINER_IMAGE =
"quay.io/infinispan/server:13.0.5.Final-1";
+ private static final String CONTAINER_NAME = "infinispan";
+ private static final String DEFAULT_USERNAME = "admin";
+ private static final String DEFAULT_PASSWORD = "password";
+ private static final int CONTAINER_PORT = 11222;
+
+ private GenericContainer container;
/**
* Main method to start the application.
*/
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
+
+
+
+ @Configuration
+ public class InfinispanConfiguration {
+
+ private void initContainer() {
+ LOG.info("start infinispan docker container");
+ Consumer<CreateContainerCmd> cmd = e -> {
+ e.getHostConfig().withPortBindings(new
PortBinding(Ports.Binding.bindPort(CONTAINER_PORT),
+ new
ExposedPort(CONTAINER_PORT)));
+
+ };
+ final Logger containerLog = LoggerFactory.getLogger("container." +
CONTAINER_NAME);
+ final Consumer<OutputFrame> logConsumer = new
Slf4jLogConsumer(containerLog);
+
+ container = new
GenericContainer<>(CONTAINER_IMAGE).withNetworkAliases(CONTAINER_NAME)
+ .withEnv("USER", DEFAULT_USERNAME).withEnv("PASS",
DEFAULT_PASSWORD)
+ .withLogConsumer(logConsumer)
+ .withClasspathResourceMapping("infinispan.xml",
"/user-config/infinispan.xml",
+ BindMode.READ_ONLY)
+ .withCommand("-c",
"/user-config/infinispan.xml").withExposedPorts(CONTAINER_PORT)
+
.withCreateContainerCmdModifier(cmd).waitingFor(Wait.forListeningPort())
+
.waitingFor(Wait.forLogMessage(".*Infinispan.*Server.*started.*", 1));
+ container.start();
+
+ }
+
+ protected ConfigurationBuilder getConfiguration() {
+ ConfigurationBuilder clientBuilder = new ConfigurationBuilder();
+
+ clientBuilder.forceReturnValues(true);
+
+
+ clientBuilder.addServer().host("localhost").port(CONTAINER_PORT);
+
+ // add security info
+
clientBuilder.security().authentication().username(DEFAULT_USERNAME).password(DEFAULT_PASSWORD)
+
.serverName("infinispan").saslMechanism("DIGEST-MD5").realm("default");
+ if (SystemUtils.IS_OS_MAC) {
+ Properties properties = new Properties();
+ properties.put("infinispan.client.hotrod.client_intelligence",
"BASIC");
+ clientBuilder.withProperties(properties);
+ }
+
+ return clientBuilder;
+ }
+
+ @Bean(name = "infinispanRemoteComponent")
+ public InfinispanRemoteComponent infinispanRemoteComponent() {
+ initContainer();
+ InfinispanRemoteConfiguration infinispanRemoteConfiguration = new
InfinispanRemoteConfiguration();
+
+ infinispanRemoteConfiguration.setHosts("localhost" + ":" +
CONTAINER_PORT);
+
+ infinispanRemoteConfiguration.setUsername(DEFAULT_USERNAME);
+ infinispanRemoteConfiguration.setPassword(DEFAULT_PASSWORD);
+
+ RemoteCacheManager cacheContainer = new
RemoteCacheManager(getConfiguration().build());
+ cacheContainer.administration()
+ .getOrCreateCache("default", new
org.infinispan.configuration.cache.ConfigurationBuilder()
+ .clustering().cacheMode(CacheMode.DIST_SYNC).build());
+
+ infinispanRemoteConfiguration.setCacheContainer(cacheContainer);
+ InfinispanRemoteComponent component = new
InfinispanRemoteComponent();
+ component.setConfiguration(infinispanRemoteConfiguration);
+
+ return component;
+ }
+ }
}
// CHECKSTYLE:ON
diff --git
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
index f93cb98..b4c82c5 100644
---
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
+++
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
@@ -33,10 +33,10 @@ public class CamelInfinispanRoute extends RouteBuilder {
.setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT)
.setHeader(InfinispanConstants.KEY).constant("1")
.setHeader(InfinispanConstants.VALUE).constant("test")
- .to("infinispan://default")
+ .to("infinispanRemoteComponent://default")
.setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET)
.setHeader(InfinispanConstants.KEY).constant("1")
- .to("infinispan://default").log("Received body: ${body}");
+ .to("infinispanRemoteComponent://default").log("Received body:
${body}");
}
}
diff --git a/infinispan/src/main/resources/infinispan.xml
b/infinispan/src/main/resources/infinispan.xml
new file mode 100644
index 0000000..d82c7e9
--- /dev/null
+++ b/infinispan/src/main/resources/infinispan.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:infinispan:config:13.0
https://infinispan.org/schemas/infinispan-config-13.0.xsd
+ urn:infinispan:server:13.0
https://infinispan.org/schemas/infinispan-server-13.0.xsd"
+ xmlns="urn:infinispan:config:13.0"
+ xmlns:server="urn:infinispan:server:13.0">
+
+ <cache-container name="default" statistics="true">
+ <metrics accurate-size="true"/>
+ <transport cluster="${infinispan.cluster.name:cluster}"
stack="${infinispan.cluster.stack:tcp}" node-name="${infinispan.node.name:}"/>
+ <security>
+ <authorization/>
+ </security>
+ </cache-container>
+
+ <server xmlns="urn:infinispan:server:13.0">
+ <interfaces>
+ <interface name="public">
+ <inet-address
value="${infinispan.bind.address:127.0.0.1}"/>
+ </interface>
+ </interfaces>
+
+ <socket-bindings default-interface="public"
port-offset="${infinispan.socket.binding.port-offset:0}">
+ <socket-binding name="default"
port="${infinispan.bind.port:11222}"/>
+ <socket-binding name="memcached" port="11221"/>
+ </socket-bindings>
+
+ <security>
+ <credential-stores>
+ <credential-store name="credentials"
path="credentials.pfx">
+ <clear-text-credential
clear-text="secret"/>
+ </credential-store>
+ </credential-stores>
+ <security-realms>
+ <security-realm name="default">
+ <!-- Uncomment to enable TLS on the
realm -->
+ <!-- server-identities>
+ <ssl>
+ <keystore
path="application.keystore"
+
password="password" alias="server"
+
generate-self-signed-certificate-host="localhost"/>
+ </ssl>
+ </server-identities-->
+ <properties-realm
groups-attribute="Roles">
+ <user-properties
path="users.properties"/>
+ <group-properties
path="groups.properties"/>
+ </properties-realm>
+ </security-realm>
+ </security-realms>
+ </security>
+
+ <endpoints socket-binding="default" security-realm="default"/>
+ </server>
+</infinispan>