From 89f22762b3b68c27d7186eb3ccfba21d829fd679 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Tue, 8 Jun 2021 14:20:38 +0300 Subject: [PATCH] Feature - Helidon CDI integration. #3649 --- pom.xml | 1 + redisson-helidon/README.md | 54 +++++++ redisson-helidon/pom.xml | 135 ++++++++++++++++++ .../redisson/helidon/RedissonExtension.java | 90 ++++++++++++ .../src/main/resources/META-INF/beans.xml | 6 + .../javax.enterprise.inject.spi.Extension | 1 + .../org/redisson/RedissonExtensionTest.java | 51 +++++++ .../src/test/resources/META-INF/beans.xml | 6 + .../META-INF/microprofile-config.properties | 1 + 9 files changed, 345 insertions(+) create mode 100644 redisson-helidon/README.md create mode 100644 redisson-helidon/pom.xml create mode 100644 redisson-helidon/src/main/java/org/redisson/helidon/RedissonExtension.java create mode 100644 redisson-helidon/src/main/resources/META-INF/beans.xml create mode 100644 redisson-helidon/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension create mode 100644 redisson-helidon/src/test/java/org/redisson/RedissonExtensionTest.java create mode 100644 redisson-helidon/src/test/resources/META-INF/beans.xml create mode 100644 redisson-helidon/src/test/resources/META-INF/microprofile-config.properties diff --git a/pom.xml b/pom.xml index 05a8d6f15..3bd63fe32 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,7 @@ redisson-spring-boot-starter redisson-mybatis redisson-hibernate + redisson-helidon diff --git a/redisson-helidon/README.md b/redisson-helidon/README.md new file mode 100644 index 000000000..8cbbe2422 --- /dev/null +++ b/redisson-helidon/README.md @@ -0,0 +1,54 @@ +# Helidon CDI extension for Redis + +Integrates Redisson with [Helidon](https://helidon.io/) framework. + +Supports Helidon 1.4.x - 2.3.x + +## Usage + +### 1. Add `redisson-helidon` dependency into your project: + +Maven + +```xml + + org.redisson + redisson-helidon + 3.16.0 + +``` + +Gradle + +```groovy + compile 'org.redisson:redisson-helidon:3.16.0' +``` + +### 2. Add settings into `META-INF/microprofile-config.properties` file + +Config structure is a flat Redisson YAML configuration - +[single mode](https://github.com/redisson/redisson/wiki/2.-Configuration#262-single-instance-yaml-config-format), +[replicated mode](https://github.com/redisson/redisson/wiki/2.-Configuration#252-replicated-yaml-config-format), +[cluster mode](https://github.com/redisson/redisson/wiki/2.-Configuration#242-cluster-yaml-config-format), +[sentinel mode](https://github.com/redisson/redisson/wiki/2.-Configuration#272-sentinel-yaml-config-format), +[proxy mode](https://github.com/redisson/redisson/wiki/2.-Configuration#292-proxy-mode-yaml-config-format) + +Below is the configuration for Redisson instance named `simple`. +``` +org.redisson.Redisson.simple.singleServerConfig.address=redis://127.0.0.1:6379 +org.redisson.Redisson.simple.singleServerConfig.connectionPoolSize=64 +org.redisson.Redisson.simple.threads=16 +org.redisson.Redisson.simple.nettyThreads=32 +``` + +### 3. Use Redisson + +```java +@Inject +@Named("simple") +private RedissonClient redisson; +``` + +For injection without @Named annotation use instance name - `default`. + +Consider __[Redisson PRO](https://redisson.pro)__ version for **ultra-fast performance** and **support by SLA**. diff --git a/redisson-helidon/pom.xml b/redisson-helidon/pom.xml new file mode 100644 index 000000000..e1eed2f97 --- /dev/null +++ b/redisson-helidon/pom.xml @@ -0,0 +1,135 @@ + + 4.0.0 + + + org.redisson + redisson-parent + 3.15.7-SNAPSHOT + ../ + + + redisson-helidon + jar + + Redisson/Helidon integration + + + + + com.mycila + license-maven-plugin + 3.0 + + ${basedir} +
${basedir}/../header.txt
+ false + true + false + + src/main/java/org/redisson/ + + + target/** + + true + + JAVADOC_STYLE + + true + true + UTF-8 +
+ + + + check + + + +
+ + + maven-javadoc-plugin + + + + maven-compiler-plugin + +
+
+ + + + org.redisson + redisson + ${project.version} + + + + jakarta.enterprise + jakarta.enterprise.cdi-api + 2.0.2 + provided + + + + org.jboss + jandex + 2.3.0.Final + runtime + true + + + io.helidon.microprofile.config + helidon-microprofile-config + [1.4.0,) + runtime + true + + + + org.eclipse.microprofile.config + microprofile-config-api + 1.4 + compile + + + + io.helidon.microprofile.cdi + helidon-microprofile-cdi + [1.4.0,) + test + + + org.junit.jupiter + junit-jupiter-engine + 5.7.1 + test + + + org.junit.jupiter + junit-jupiter-params + 5.7.1 + test + + + io.micronaut.test + micronaut-test-junit5 + 2.0.0 + test + + + ch.qos.logback + logback-classic + 1.2.3 + test + + + org.assertj + assertj-core + 3.18.1 + test + + + +
diff --git a/redisson-helidon/src/main/java/org/redisson/helidon/RedissonExtension.java b/redisson-helidon/src/main/java/org/redisson/helidon/RedissonExtension.java new file mode 100644 index 000000000..0869537e7 --- /dev/null +++ b/redisson-helidon/src/main/java/org/redisson/helidon/RedissonExtension.java @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2013-2021 Nikita Koksharov + * + * Licensed 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. + */ +package org.redisson.helidon; + +import org.eclipse.microprofile.config.Config; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.PropertiesConvertor; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.*; +import javax.inject.Named; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * + * @author Nikita Koksharov + * + */ +public class RedissonExtension implements Extension { + + private final Set qualifiers = new HashSet<>(); + + private void processRedissonInjectionPoint(@Observes ProcessInjectionPoint point) { + if (point == null) { + return; + } + InjectionPoint injectionPoint = point.getInjectionPoint(); + if (injectionPoint == null) { + return; + } + + qualifiers.addAll(injectionPoint.getQualifiers()); + } + + private void addBeans(@Observes AfterBeanDiscovery discovery, BeanManager beanManager) { + if (discovery == null || beanManager == null) { + return; + } + + for (Annotation qualifier : qualifiers) { + Set qualifiers = Collections.singleton(qualifier); + + discovery.addBean() + .scope(ApplicationScoped.class) + .addQualifiers(qualifiers) + .addTransitiveTypeClosure(RedissonClient.class) + .produceWith((instance) -> { + + String instanceName = "default"; + if (qualifier instanceof Named) { + instanceName = ((Named) qualifier).value(); + } + + Config cfg = instance.select(Config.class).get(); + String yamlConfig = PropertiesConvertor.toYaml(Redisson.class.getName() + "." + instanceName + ".", + cfg.getPropertyNames(), prop -> { + return cfg.getValue(prop, String.class); + }); + + try { + org.redisson.config.Config config = org.redisson.config.Config.fromYAML(yamlConfig); + return Redisson.create(config); + } catch (IOException e) { + throw new IllegalStateException(e); + } + }); + } + } + + +} diff --git a/redisson-helidon/src/main/resources/META-INF/beans.xml b/redisson-helidon/src/main/resources/META-INF/beans.xml new file mode 100644 index 000000000..e7d2c6c7b --- /dev/null +++ b/redisson-helidon/src/main/resources/META-INF/beans.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/redisson-helidon/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/redisson-helidon/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension new file mode 100644 index 000000000..0caad7871 --- /dev/null +++ b/redisson-helidon/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension @@ -0,0 +1 @@ +org.redisson.helidon.RedissonExtension \ No newline at end of file diff --git a/redisson-helidon/src/test/java/org/redisson/RedissonExtensionTest.java b/redisson-helidon/src/test/java/org/redisson/RedissonExtensionTest.java new file mode 100644 index 000000000..c991d424b --- /dev/null +++ b/redisson-helidon/src/test/java/org/redisson/RedissonExtensionTest.java @@ -0,0 +1,51 @@ +package org.redisson; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.redisson.api.RBucket; +import org.redisson.api.RedissonClient; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.Initialized; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.Instance; +import javax.enterprise.inject.literal.NamedLiteral; +import javax.enterprise.inject.se.SeContainerInitializer; +import javax.enterprise.inject.spi.CDI; +import javax.inject.Named; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * + * @author Nikita Koksharov + * + */ +@ApplicationScoped +public class RedissonExtensionTest { + + @BeforeEach + void startCdiContainer() { + System.setProperty("org.redisson.Redisson.simple.singleServerConfig.address", "redis://127.0.0.1:6379"); + SeContainerInitializer initializer = SeContainerInitializer.newInstance(); + initializer.initialize(); + } + + private void onInit(@Observes @Initialized(ApplicationScoped.class) Object event, + @Named("simple") RedissonClient client) { + assertThat(client).isNotNull(); + } + + @Test + public void test() { + Instance instance = CDI.current().select(RedissonClient.class, NamedLiteral.of("simple")); + RedissonClient redissonClient = instance.get(); + + RBucket b = redissonClient.getBucket("test"); + b.set("1"); + assertThat(b.get()).isEqualTo("1"); + assertThat(b.delete()).isTrue(); + } + + +} diff --git a/redisson-helidon/src/test/resources/META-INF/beans.xml b/redisson-helidon/src/test/resources/META-INF/beans.xml new file mode 100644 index 000000000..e7d2c6c7b --- /dev/null +++ b/redisson-helidon/src/test/resources/META-INF/beans.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/redisson-helidon/src/test/resources/META-INF/microprofile-config.properties b/redisson-helidon/src/test/resources/META-INF/microprofile-config.properties new file mode 100644 index 000000000..d2485d8a1 --- /dev/null +++ b/redisson-helidon/src/test/resources/META-INF/microprofile-config.properties @@ -0,0 +1 @@ +mp.initializer.allow=true \ No newline at end of file -- GitLab