This is an automated email from the ASF dual-hosted git repository.
gtully pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new a88b074ee0 ARTEMIS-5700 use a singleton http client
a88b074ee0 is described below
commit a88b074ee0408eddf90b60ecba6e5f01ddc0c012
Author: Gary Tully <[email protected]>
AuthorDate: Fri Oct 10 12:42:02 2025 +0100
ARTEMIS-5700 use a singleton http client
---
.../kubernetes/client/KubernetesClientImpl.java | 43 +++++++++++++++++-----
.../client/KubernetesClientImplTest.java | 13 +++++--
2 files changed, 43 insertions(+), 13 deletions(-)
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImpl.java
index 54dd9f0b79..e51ed960d6 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImpl.java
@@ -55,18 +55,40 @@ public class KubernetesClientImpl implements
KubernetesClient {
private URI apiUri;
private String tokenPath;
- private String caPath;
+
+ private static volatile HttpClient httpClient;
+
+ private static HttpClient getHttpClientSingleton() {
+ HttpClient result = httpClient;
+ if (result != null) {
+ return result;
+ }
+ synchronized (KubernetesClientImpl.class) {
+ if (httpClient == null) {
+ try {
+ httpClient =
HttpClient.newBuilder().sslContext(buildSSLContext()).build();
+ } catch (Exception e) {
+ logger.error("Unable to build a valid SSLContext or
HttpClient", e);
+ }
+ }
+ }
+ return httpClient;
+ }
+
+ // for tests
+ public static void clearHttpClient() {
+ httpClient = null;
+ }
public KubernetesClientImpl() {
this.tokenPath = getParam(KUBERNETES_TOKEN_PATH,
DEFAULT_KUBERNETES_TOKEN_PATH);
- this.caPath = getParam(KUBERNETES_CA_PATH, DEFAULT_KUBERNETES_CA_PATH);
String host = getParam(KUBERNETES_HOST);
String port = getParam(KUBERNETES_PORT);
this.apiUri =
URI.create(String.format(KUBERNETES_TOKENREVIEW_URI_PATTERN, host, port));
logger.debug("using apiUri {}", apiUri);
}
- public String getParam(String name, String defaultValue) {
+ public static String getParam(String name, String defaultValue) {
String value = System.getProperty(name);
if (value == null) {
value = System.getenv(name);
@@ -95,14 +117,10 @@ public class KubernetesClientImpl implements
KubernetesClient {
}
String jsonRequest = buildJsonRequest(token);
- SSLContext ctx;
- try {
- ctx = buildSSLContext();
- } catch (Exception e) {
- logger.error("Unable to build a valid SSLContext", e);
+ HttpClient client = getHttpClient();
+ if (client == null) {
return tokenReview;
}
- HttpClient client = HttpClient.newBuilder().sslContext(ctx).build();
HttpRequest request = HttpRequest.newBuilder(apiUri)
.header("Authorization", "Bearer " + authToken)
@@ -124,6 +142,10 @@ public class KubernetesClientImpl implements
KubernetesClient {
return tokenReview;
}
+ protected HttpClient getHttpClient() {
+ return KubernetesClientImpl.getHttpClientSingleton();
+ }
+
private String readFile(String path) throws IOException {
try (Scanner scanner = new Scanner(Path.of(path))) {
StringBuilder buffer = new StringBuilder();
@@ -147,8 +169,9 @@ public class KubernetesClientImpl implements
KubernetesClient {
.build().toString();
}
- private SSLContext buildSSLContext() throws Exception {
+ private static SSLContext buildSSLContext() throws Exception {
SSLContext ctx = SSLContext.getInstance("TLS");
+ String caPath = getParam(KUBERNETES_CA_PATH, DEFAULT_KUBERNETES_CA_PATH);
File certFile = new File(caPath);
if (!certFile.exists()) {
logger.debug("Kubernetes CA certificate not found at: {}. Truststore
not configured", caPath);
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImplTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImplTest.java
index 5dd12fcd97..456460a2d5 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImplTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/spi/core/security/jaas/kubernetes/client/KubernetesClientImplTest.java
@@ -104,6 +104,7 @@ public class KubernetesClientImplTest {
@BeforeEach
public void reset() {
+ KubernetesClientImpl.clearHttpClient();
mockServer.reset();
}
@@ -169,12 +170,12 @@ public class KubernetesClientImplTest {
if (System.getProperty(envKv.getKey()) == null) {
KubernetesClientImpl clientImpl = new KubernetesClientImpl();
- assertEquals(envKv.getValue(), clientImpl.getParam(envKv.getKey(),
null));
+ assertEquals(envKv.getValue(),
KubernetesClientImpl.getParam(envKv.getKey(), null));
final String valFromProp = "bla";
try {
System.setProperty(envKv.getKey(), valFromProp);
- assertEquals(valFromProp, clientImpl.getParam(envKv.getKey(),
null));
+ assertEquals(valFromProp,
KubernetesClientImpl.getParam(envKv.getKey(), null));
} finally {
System.clearProperty(envKv.getKey());
}
@@ -183,7 +184,7 @@ public class KubernetesClientImplTest {
String candidate = valFromProp;
for (int i = 0; i < 10; i++) {
if (System.getenv(candidate) == null &&
System.getProperty(candidate) == null) {
- assertEquals(candidate, clientImpl.getParam(candidate,
candidate));
+ assertEquals(candidate,
KubernetesClientImpl.getParam(candidate, candidate));
break;
}
candidate += i;
@@ -195,4 +196,10 @@ public class KubernetesClientImplTest {
}
}
+ @Test
+ public void testSingeltonHttpClient() throws Exception {
+ KubernetesClientImpl clientImplFirst = new KubernetesClientImpl();
+ KubernetesClientImpl clientImplSecond = new KubernetesClientImpl();
+ assertEquals(clientImplFirst.getHttpClient(),
clientImplSecond.getHttpClient());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact