Skip to content

Commit 3830912

Browse files
authored
Merge pull request #2772 from gaol/vertx_from_cdi
Tries to inject Vertx instance from CDI using a qualifier
2 parents c3d946c + a40bcd0 commit 3830912

File tree

4 files changed

+164
-3
lines changed

4 files changed

+164
-3
lines changed

smallrye-reactive-messaging-provider/src/main/java/io/smallrye/reactive/messaging/providers/connectors/ExecutionHolder.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@
77
import jakarta.enterprise.context.BeforeDestroyed;
88
import jakarta.enterprise.event.Observes;
99
import jakarta.enterprise.event.Reception;
10+
import jakarta.enterprise.inject.Any;
11+
import jakarta.enterprise.inject.Default;
1012
import jakarta.enterprise.inject.Instance;
1113
import jakarta.inject.Inject;
1214

15+
import org.eclipse.microprofile.config.Config;
16+
17+
import io.smallrye.common.annotation.Identifier;
1318
import io.vertx.mutiny.core.Vertx;
1419

1520
/**
@@ -19,6 +24,8 @@
1924
@ApplicationScoped
2025
public class ExecutionHolder {
2126

27+
private static final String REACTIVE_MESSAGING_VERTX_CDI_QUALIFIER = "mp.messaging.connector.vertx.cdi.identifier";
28+
2229
private boolean internalVertxInstance = false;
2330
final Vertx vertx;
2431

@@ -40,17 +47,34 @@ public ExecutionHolder(Vertx vertx) {
4047
}
4148

4249
@Inject
43-
public ExecutionHolder(Instance<Vertx> instanceOfVertx) {
44-
if (instanceOfVertx == null || instanceOfVertx.isUnsatisfied()) {
50+
public ExecutionHolder(@Any Instance<Vertx> instanceOfVertx, Instance<Config> config) {
51+
String cdiQualifier = null;
52+
if (config != null && !config.isUnsatisfied()) {
53+
final Config theConfig = config.get();
54+
cdiQualifier = theConfig.getConfigValue(REACTIVE_MESSAGING_VERTX_CDI_QUALIFIER).getValue();
55+
}
56+
final Instance<Vertx> vertxInstance;
57+
if (cdiQualifier != null && !cdiQualifier.isEmpty()) {
58+
log.vertxFromCDIQualifier(cdiQualifier);
59+
vertxInstance = instanceOfVertx.select(Identifier.Literal.of(cdiQualifier));
60+
} else {
61+
vertxInstance = instanceOfVertx.select(Default.Literal.INSTANCE);
62+
}
63+
if (vertxInstance == null || vertxInstance.isUnsatisfied()) {
4564
internalVertxInstance = true;
4665
this.vertx = Vertx.vertx();
4766
log.vertXInstanceCreated();
4867
} else {
49-
this.vertx = instanceOfVertx.get();
68+
this.vertx = vertxInstance.get();
5069
}
5170
}
5271

5372
public Vertx vertx() {
5473
return vertx;
5574
}
75+
76+
// this is used in the test
77+
boolean isInternalVertxInstance() {
78+
return internalVertxInstance;
79+
}
5680
}

smallrye-reactive-messaging-provider/src/main/java/io/smallrye/reactive/messaging/providers/i18n/ProviderLogging.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,8 @@ public interface ProviderLogging extends BasicLogger {
147147
@LogMessage(level = Logger.Level.WARN)
148148
@Message(id = 243, value = "Processing method '%s' annotated with @Acknowledgement(POST_PROCESSING), but may not be compatible with post-processing acknowledgement management. You may experience duplicate (negative-)acknowledgement of messages.")
149149
void postProcessingNotFullySupported(String methodAsString);
150+
151+
@LogMessage(level = Logger.Level.DEBUG)
152+
@Message(id = 244, value = "Trying to get Vertx instance using Identifier qualifier: %s.")
153+
void vertxFromCDIQualifier(String cdiQualifier);
150154
}

smallrye-reactive-messaging-provider/src/test/java/io/smallrye/reactive/messaging/WeldTestBaseWithoutTails.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44

55
import java.io.File;
66
import java.io.IOException;
7+
import java.io.OutputStream;
78
import java.io.UncheckedIOException;
89
import java.nio.file.Files;
910
import java.util.Collections;
1011
import java.util.List;
12+
import java.util.Properties;
1113

1214
import jakarta.enterprise.inject.se.SeContainer;
1315
import jakarta.enterprise.inject.se.SeContainerInitializer;
@@ -98,6 +100,25 @@ public static void installConfig(String path) {
98100
}
99101
}
100102

103+
@SuppressWarnings("ResultOfMethodCallIgnored")
104+
public static void installConfigFromProperties(Properties properties) {
105+
releaseConfig();
106+
File out = new File("target/test-classes/META-INF/microprofile-config.properties");
107+
if (out.isFile()) {
108+
out.delete();
109+
}
110+
out.getParentFile().mkdirs();
111+
try (OutputStream outputStream = Files.newOutputStream(out.toPath())) {
112+
properties.store(outputStream, null);
113+
System.out.println("Installed configuration:");
114+
List<String> list = Files.readAllLines(out.toPath());
115+
list.forEach(System.out::println);
116+
System.out.println("---------");
117+
} catch (IOException e) {
118+
throw new UncheckedIOException(e);
119+
}
120+
}
121+
101122
@BeforeEach
102123
public void setUp() {
103124
releaseConfig();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package io.smallrye.reactive.messaging.providers.connectors;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.Properties;
6+
7+
import jakarta.enterprise.event.Observes;
8+
import jakarta.enterprise.inject.Any;
9+
import jakarta.enterprise.inject.Default;
10+
import jakarta.enterprise.inject.spi.AfterBeanDiscovery;
11+
import jakarta.enterprise.inject.spi.BeanManager;
12+
import jakarta.enterprise.inject.spi.Extension;
13+
14+
import org.junit.jupiter.api.Test;
15+
16+
import io.smallrye.common.annotation.Identifier;
17+
import io.smallrye.reactive.messaging.WeldTestBaseWithoutTails;
18+
import io.vertx.mutiny.core.Vertx;
19+
20+
public class VertxInstanceSelectTest extends WeldTestBaseWithoutTails {
21+
22+
private static final Properties CONNECTOR_VERTX_CDI_IDENTIFIER_PROPERTIES = new Properties();
23+
static {
24+
CONNECTOR_VERTX_CDI_IDENTIFIER_PROPERTIES.setProperty("mp.messaging.connector.vertx.cdi.identifier", "vertx");
25+
}
26+
27+
private static final Vertx vertxForCDI = Vertx.vertx();
28+
29+
// Test the case that 'mp.messaging.connector.vertx.cdi.identifier' is NOT specified and NO Vertx Bean exposed
30+
// from CDI container. The vertx instance should be internal instance.
31+
@Test
32+
public void testNoVertxBeanNoIdentifier() {
33+
initialize();
34+
ExecutionHolder executionHolder = get(ExecutionHolder.class);
35+
assertThat(executionHolder).isNotNull();
36+
assertThat(executionHolder.vertx()).isNotNull();
37+
assertThat(executionHolder.vertx()).isNotEqualTo(vertxForCDI);
38+
assertThat(executionHolder.isInternalVertxInstance()).isTrue();
39+
}
40+
41+
// Test the case that 'mp.messaging.connector.vertx.cdi.identifier' IS specified and NO Vertx Bean exposed
42+
// from CDI container. The vertx instance should be internal instance.
43+
@Test
44+
public void testNoVertxBeanWithIdentifier() {
45+
installConfigFromProperties(CONNECTOR_VERTX_CDI_IDENTIFIER_PROPERTIES);
46+
initialize();
47+
ExecutionHolder executionHolder = get(ExecutionHolder.class);
48+
assertThat(executionHolder).isNotNull();
49+
assertThat(executionHolder.vertx()).isNotNull();
50+
assertThat(executionHolder.vertx()).isNotEqualTo(vertxForCDI);
51+
assertThat(executionHolder.isInternalVertxInstance()).isTrue();
52+
}
53+
54+
// Test the case that 'mp.messaging.connector.vertx.cdi.identifier' is NOT specified but has Vertx Bean exposed
55+
// from CDI container using Default qualifier. The vertx instance should be vertxForCDI.
56+
@Test
57+
public void testWithVertxBeanDefaultNoIdentifier() {
58+
addExtensionClass(VertxCDIDefaultExtension.class);
59+
initialize();
60+
ExecutionHolder executionHolder = get(ExecutionHolder.class);
61+
assertThat(executionHolder).isNotNull();
62+
assertThat(executionHolder.vertx()).isNotNull();
63+
assertThat(executionHolder.vertx()).isEqualTo(vertxForCDI);
64+
assertThat(executionHolder.isInternalVertxInstance()).isFalse();
65+
}
66+
67+
// Test the case that 'mp.messaging.connector.vertx.cdi.identifier' IS specified but has Vertx Bean exposed
68+
// from CDI container using Default qualifier. The vertx instance should be internal instance.
69+
@Test
70+
public void testWithVertxBeanDefaultWithIdentifier() {
71+
installConfigFromProperties(CONNECTOR_VERTX_CDI_IDENTIFIER_PROPERTIES);
72+
addExtensionClass(VertxCDIDefaultExtension.class);
73+
initialize();
74+
ExecutionHolder executionHolder = get(ExecutionHolder.class);
75+
assertThat(executionHolder).isNotNull();
76+
assertThat(executionHolder.vertx()).isNotNull();
77+
assertThat(executionHolder.vertx()).isNotEqualTo(vertxForCDI);
78+
assertThat(executionHolder.isInternalVertxInstance()).isTrue();
79+
}
80+
81+
// Test the case that 'mp.messaging.connector.vertx.cdi.identifier' is specified and has Vertx Bean exposed
82+
// from CDI container using the Identifier qualifier. The vertx instance should be vertxForCDI.
83+
@Test
84+
public void testWithVertxBeanIdentifierWithIdentifier() {
85+
installConfigFromProperties(CONNECTOR_VERTX_CDI_IDENTIFIER_PROPERTIES);
86+
addExtensionClass(VertxCDIIdentifierExtension.class);
87+
initialize();
88+
ExecutionHolder executionHolder = get(ExecutionHolder.class);
89+
assertThat(executionHolder).isNotNull();
90+
assertThat(executionHolder.vertx()).isNotNull();
91+
assertThat(executionHolder.vertx()).isEqualTo(vertxForCDI);
92+
assertThat(executionHolder.isInternalVertxInstance()).isFalse();
93+
}
94+
95+
public static class VertxCDIDefaultExtension implements Extension {
96+
public void registerVertxBean(@Observes AfterBeanDiscovery abd, BeanManager beanManager) {
97+
abd.addBean()
98+
.beanClass(Vertx.class).types(Vertx.class)
99+
.addQualifiers(Any.Literal.INSTANCE, Default.Literal.INSTANCE)
100+
.createWith(cc -> vertxForCDI);
101+
}
102+
}
103+
104+
public static class VertxCDIIdentifierExtension implements Extension {
105+
public void registerVertxBean(@Observes AfterBeanDiscovery abd, BeanManager beanManager) {
106+
abd.addBean()
107+
.beanClass(Vertx.class).types(Vertx.class)
108+
.addQualifiers(Any.Literal.INSTANCE, Identifier.Literal.of("vertx"))
109+
.createWith(cc -> vertxForCDI);
110+
}
111+
}
112+
}

0 commit comments

Comments
 (0)