-
Notifications
You must be signed in to change notification settings - Fork 178
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2695 from ozangunalp/client_config_interceptor
ClientCustomizer
- Loading branch information
Showing
62 changed files
with
826 additions
and
260 deletions.
There are no files selected for viewing
34 changes: 34 additions & 0 deletions
34
api/src/main/java/io/smallrye/reactive/messaging/ClientCustomizer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package io.smallrye.reactive.messaging; | ||
|
||
import jakarta.enterprise.inject.spi.Prioritized; | ||
|
||
import org.eclipse.microprofile.config.Config; | ||
|
||
/** | ||
* A customizer that can be used to modify the configuration used to create a messaging client. | ||
* | ||
* @param <T> the type of the configuration object | ||
*/ | ||
public interface ClientCustomizer<T> extends Prioritized { | ||
|
||
/** | ||
* The default priority for config customizers. | ||
*/ | ||
int CLIENT_CONFIG_CUSTOMIZER_DEFAULT_PRIORITY = 100; | ||
|
||
/** | ||
* Customize the given configuration object. | ||
* | ||
* @param channel the channel name | ||
* @param channelConfig the channel configuration | ||
* @param config the configuration object | ||
* @return the modified configuration object, or {@code null} to skip this customizer | ||
*/ | ||
T customize(String channel, Config channelConfig, T config); | ||
|
||
@Override | ||
default int getPriority() { | ||
return CLIENT_CONFIG_CUSTOMIZER_DEFAULT_PRIORITY; | ||
} | ||
|
||
} |
25 changes: 25 additions & 0 deletions
25
documentation/src/main/docs/concepts/client-customizers.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# Client Customizers | ||
|
||
Client customizers allow to customize the client instance created by the connector. | ||
Only connectors which create their own client instance support customizers. | ||
|
||
To define a client customizer, you need to provide a CDI bean that implements the `ClientCustomizer<T>` interface, | ||
parameterized with the config type: | ||
|
||
``` java | ||
{{ insert('customizers/MyClientCustomizer.java') }} | ||
``` | ||
|
||
Connectors which support client customizers will discover all beans and call the `customize` method, | ||
with the _channel name_, the _channel configuration_ and the configuration that'll be used to create the client instance. | ||
If the customizer returns `null` it'll be skipped. | ||
|
||
If you have multiple customizers, customizers can override the `getPriority` method to define the order in which they are called. | ||
|
||
Currently, the following core connectors support client customizers: | ||
|
||
- Kafka: `ClientCustomizer<Map<String, Object>>` | ||
- RabbitMQ: `ClientCustomizer<RabbitMQOptions>` | ||
- AMQP 1.0: `ClientCustomizer<AmqpClientOptions>` | ||
- MQTT: `ClientCustomizer<MqttClientSessionOptions>` | ||
- Pulsar: `ClientCustomizer<ClientBuilder>`, `ClientCustomizer<ConsumerBuilder<?>>`, `ClientCustomizer<ProducerBuilder<?>>` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
package customizers; | ||
|
||
public class ClientConfig { | ||
} |
17 changes: 17 additions & 0 deletions
17
documentation/src/main/java/customizers/MyClientCustomizer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package customizers; | ||
|
||
import jakarta.enterprise.context.ApplicationScoped; | ||
|
||
import org.eclipse.microprofile.config.Config; | ||
|
||
import io.smallrye.reactive.messaging.ClientCustomizer; | ||
|
||
@ApplicationScoped | ||
public class MyClientCustomizer implements ClientCustomizer<ClientConfig> { | ||
@Override | ||
public ClientConfig customize(String channel, Config channelConfig, ClientConfig config) { | ||
// customize the client configuration | ||
return config; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
69 changes: 69 additions & 0 deletions
69
...ng-amqp/src/main/java/io/smallrye/reactive/messaging/amqp/SslContextClientCustomizer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package io.smallrye.reactive.messaging.amqp; | ||
|
||
import static io.smallrye.reactive.messaging.amqp.i18n.AMQPExceptions.ex; | ||
import static io.smallrye.reactive.messaging.amqp.i18n.AMQPLogging.log; | ||
|
||
import java.util.Optional; | ||
|
||
import javax.net.ssl.SSLContext; | ||
|
||
import jakarta.enterprise.context.ApplicationScoped; | ||
import jakarta.enterprise.inject.Any; | ||
import jakarta.enterprise.inject.Instance; | ||
import jakarta.inject.Inject; | ||
|
||
import org.eclipse.microprofile.config.Config; | ||
|
||
import io.netty.handler.ssl.ApplicationProtocolConfig; | ||
import io.netty.handler.ssl.IdentityCipherSuiteFilter; | ||
import io.netty.handler.ssl.JdkSslContext; | ||
import io.netty.handler.ssl.SslContext; | ||
import io.smallrye.reactive.messaging.ClientCustomizer; | ||
import io.smallrye.reactive.messaging.providers.helpers.CDIUtils; | ||
import io.vertx.amqp.AmqpClientOptions; | ||
import io.vertx.core.net.JdkSSLEngineOptions; | ||
import io.vertx.core.spi.tls.SslContextFactory; | ||
|
||
@ApplicationScoped | ||
public class SslContextClientCustomizer implements ClientCustomizer<AmqpClientOptions> { | ||
|
||
@Inject | ||
@Any | ||
private Instance<SSLContext> clientSslContexts; | ||
|
||
@Override | ||
public AmqpClientOptions customize(String channel, Config channelConfig, AmqpClientOptions config) { | ||
AmqpConnectorCommonConfiguration commonConfiguration = new AmqpConnectorCommonConfiguration(channelConfig); | ||
Optional<String> clientSslContextName = commonConfiguration.getClientSslContextName(); | ||
if (clientSslContextName.isPresent()) { | ||
SSLContext sslContext = CDIUtils.getInstanceById(clientSslContexts, clientSslContextName.get(), () -> null); | ||
if (sslContext != null) { | ||
try { | ||
config.setSslEngineOptions(new JdkSSLEngineOptions() { | ||
@Override | ||
public SslContextFactory sslContextFactory() { | ||
return new SslContextFactory() { | ||
@Override | ||
public SslContext create() { | ||
return new JdkSslContext( | ||
sslContext, | ||
true, | ||
null, | ||
IdentityCipherSuiteFilter.INSTANCE, | ||
ApplicationProtocolConfig.DISABLED, | ||
io.netty.handler.ssl.ClientAuth.NONE, | ||
null, | ||
false); | ||
} | ||
}; | ||
} | ||
}); | ||
} catch (Exception e) { | ||
log.unableToCreateClient(e); | ||
throw ex.illegalStateUnableToCreateClient(e); | ||
} | ||
} | ||
} | ||
return config; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.