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


Reply via email to