You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kie.apache.org by pe...@apache.org on 2026/10/06 11:07:36 UTC

(incubator-kie) branch main updated: Make REST work item handler WebClient pool size configurable (#7167)

This is an automated email from the ASF dual-hosted git repository.

pefernan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie.git


The following commit(s) were added to refs/heads/main by this push:
     new 35a5a40814b  Make REST work item handler WebClient pool size configurable (#7167)
35a5a40814b is described below

commit 35a5a40814ba235272d84df38e8bded998f67192
Author: Alisha Mohamed Ali <33...@users.noreply.github.com>
AuthorDate: Tue Oct 6 16:37:31 2026 +0530

     Make REST work item handler WebClient pool size configurable (#7167)
    
    Co-authored-by: Alisha Mohamed Ali <Al...@ibm.com>
---
 .../RestWorkItemHandlerTemplate.java               |  3 +-
 .../runtime/SSLWebClientOptionsProducer.java       | 17 +++++-
 .../org/kie/kogito/process/KogitoBeanProducer.java |  8 ++-
 .../workitem/rest/RestWorkItemHandlerUtils.java    | 17 ++++++
 .../rest/RestWorkItemHandlerUtilsTest.java         | 66 ++++++++++++++++++++++
 5 files changed, 107 insertions(+), 4 deletions(-)

diff --git a/kogito-jbpm/jbpm-flow-builder/src/main/resources/class-templates/RestWorkItemHandlerTemplate.java b/kogito-jbpm/jbpm-flow-builder/src/main/resources/class-templates/RestWorkItemHandlerTemplate.java
index 396a07a7f78..a2eaaeea5ee 100644
--- a/kogito-jbpm/jbpm-flow-builder/src/main/resources/class-templates/RestWorkItemHandlerTemplate.java
+++ b/kogito-jbpm/jbpm-flow-builder/src/main/resources/class-templates/RestWorkItemHandlerTemplate.java
@@ -22,6 +22,7 @@ import io.vertx.mutiny.ext.web.client.WebClient;
 import io.vertx.ext.web.client.WebClientOptions;
 import io.vertx.mutiny.core.Vertx;
 import org.kogito.workitem.rest.RestWorkItemHandler;
+import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.httpWebClientOptions;
 import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.sslWebClientOptions;
 
 
@@ -34,7 +35,7 @@ public class xxxRestWorkItemHandler extends RestWorkItemHandler {
 
     
     public xxxRestWorkItemHandler(Vertx vertx, WebClientOptions sslOptions) {
-    	super(WebClient.create(vertx), WebClient.create(vertx, sslOptions));
+    	super(WebClient.create(vertx, httpWebClientOptions(sslOptions)), WebClient.create(vertx, sslOptions));
     }
     
     @Override
diff --git a/kogito-quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common/src/main/java/org/kie/kogito/quarkus/runtime/SSLWebClientOptionsProducer.java b/kogito-quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common/src/main/java/org/kie/kogito/quarkus/runtime/SSLWebClientOptionsProducer.java
index 8b8da9f3062..b2e498add8d 100644
--- a/kogito-quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common/src/main/java/org/kie/kogito/quarkus/runtime/SSLWebClientOptionsProducer.java
+++ b/kogito-quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common/src/main/java/org/kie/kogito/quarkus/runtime/SSLWebClientOptionsProducer.java
@@ -18,20 +18,35 @@
  */
 package org.kie.kogito.quarkus.runtime;
 
+import java.util.Optional;
+
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
 import io.quarkus.arc.DefaultBean;
 import io.vertx.ext.web.client.WebClientOptions;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.enterprise.inject.Produces;
+import jakarta.inject.Inject;
 
+import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.MAX_POOL_SIZE_PROPERTY;
 import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.sslWebClientOptions;
 
 @ApplicationScoped
 public class SSLWebClientOptionsProducer {
 
+    private final Optional<Integer> maxPoolSize;
+
+    @Inject
+    public SSLWebClientOptionsProducer(@ConfigProperty(name = MAX_POOL_SIZE_PROPERTY) Optional<Integer> maxPoolSize) {
+        this.maxPoolSize = maxPoolSize;
+    }
+
     @Produces
     @DefaultBean
     public WebClientOptions webClientOptions() {
-        return sslWebClientOptions();
+        WebClientOptions options = sslWebClientOptions();
+        maxPoolSize.ifPresent(options::setMaxPoolSize);
+        return options;
     }
 }
diff --git a/kogito-springboot/starters/kogito-processes-spring-boot-starter/src/main/java/org/kie/kogito/process/KogitoBeanProducer.java b/kogito-springboot/starters/kogito-processes-spring-boot-starter/src/main/java/org/kie/kogito/process/KogitoBeanProducer.java
index 1e9f8be6217..7814bfe5236 100644
--- a/kogito-springboot/starters/kogito-processes-spring-boot-starter/src/main/java/org/kie/kogito/process/KogitoBeanProducer.java
+++ b/kogito-springboot/starters/kogito-processes-spring-boot-starter/src/main/java/org/kie/kogito/process/KogitoBeanProducer.java
@@ -19,6 +19,7 @@
 package org.kie.kogito.process;
 
 import java.util.List;
+import java.util.Optional;
 
 import org.kie.kogito.config.ConfigBean;
 import org.kie.kogito.correlation.CorrelationService;
@@ -34,6 +35,7 @@ import org.kie.kogito.uow.UnitOfWorkManager;
 import org.kie.kogito.usertask.UserTasks;
 import org.kogito.workitem.rest.RestWorkItemHandlerUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
@@ -80,8 +82,10 @@ public class KogitoBeanProducer {
 
     @Bean
     @ConditionalOnMissingBean(WebClientOptions.class)
-    WebClientOptions sslDefaultOptions() {
-        return RestWorkItemHandlerUtils.sslWebClientOptions();
+    WebClientOptions sslDefaultOptions(@Value("${" + RestWorkItemHandlerUtils.MAX_POOL_SIZE_PROPERTY + ":#{null}}") Optional<Integer> maxPoolSize) {
+        WebClientOptions options = RestWorkItemHandlerUtils.sslWebClientOptions();
+        maxPoolSize.ifPresent(options::setMaxPoolSize);
+        return options;
     }
 
     @Bean
diff --git a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
index 5834726cf4c..d45d53ffc37 100644
--- a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
+++ b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
@@ -25,6 +25,7 @@ import java.util.Objects;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import org.kie.api.annotations.KieProperty;
 import org.kie.kogito.internal.process.workitem.WorkItemExecutionException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,6 +38,13 @@ import static org.kie.kogito.internal.utils.ConversionUtils.convert;
 
 public class RestWorkItemHandlerUtils {
 
+    /**
+     * Maximum number of HTTP connections the REST work item handler keeps open per target host.
+     * When not set, the Vert.x default applies.
+     */
+    @KieProperty(type = "integer")
+    public static final String MAX_POOL_SIZE_PROPERTY = "kogito.workitem.rest.max-pool-size";
+
     private final static Logger logger = LoggerFactory.getLogger(RestWorkItemHandlerUtils.class);
 
     private RestWorkItemHandlerUtils() {
@@ -46,6 +54,15 @@ public class RestWorkItemHandlerUtils {
         return new WebClientOptions().setSsl(true).setVerifyHost(false).setTrustAll(true);
     }
 
+    /**
+     * Options for the plain HTTP client, copying every setting from the given SSL options so that
+     * one setting (e.g. the pool size) sizes both the HTTP and the HTTPS client, regardless of what
+     * else {@link #sslWebClientOptions()} configures.
+     */
+    public static WebClientOptions httpWebClientOptions(WebClientOptions sslOptions) {
+        return new WebClientOptions(sslOptions).setSsl(false);
+    }
+
     public static String getParam(Map<String, Object> parameters, String paramName) {
         return getParam(parameters, paramName, String.class, null);
     }
diff --git a/kogito-workitems/kogito-rest-workitem/src/test/java/org/kogito/workitem/rest/RestWorkItemHandlerUtilsTest.java b/kogito-workitems/kogito-rest-workitem/src/test/java/org/kogito/workitem/rest/RestWorkItemHandlerUtilsTest.java
new file mode 100644
index 00000000000..dc9af774427
--- /dev/null
+++ b/kogito-workitems/kogito-rest-workitem/src/test/java/org/kogito/workitem/rest/RestWorkItemHandlerUtilsTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.kogito.workitem.rest;
+
+import org.junit.jupiter.api.Test;
+
+import io.vertx.core.http.HttpClientOptions;
+import io.vertx.ext.web.client.WebClientOptions;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.httpWebClientOptions;
+import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.sslWebClientOptions;
+
+class RestWorkItemHandlerUtilsTest {
+
+    @Test
+    void testHttpOptionsKeepVertxDefaultPoolSize() {
+        assertThat(httpWebClientOptions(sslWebClientOptions()).getMaxPoolSize()).isEqualTo(HttpClientOptions.DEFAULT_MAX_POOL_SIZE);
+    }
+
+    @Test
+    void testHttpOptionsTakePoolSizeFromSslOptions() {
+        WebClientOptions sslOptions = sslWebClientOptions().setMaxPoolSize(20);
+        assertThat(httpWebClientOptions(sslOptions).getMaxPoolSize()).isEqualTo(20);
+    }
+
+    @Test
+    void testHttpOptionsAreNotSsl() {
+        assertThat(httpWebClientOptions(sslWebClientOptions()).isSsl()).isFalse();
+    }
+
+    @Test
+    void testHttpOptionsMirrorOtherSslSettingsBesidesPoolSize() {
+        WebClientOptions sslOptions = sslWebClientOptions().setMaxPoolSize(20).setConnectTimeout(12345).setKeepAlive(false);
+        WebClientOptions httpOptions = httpWebClientOptions(sslOptions);
+
+        assertThat(httpOptions.getConnectTimeout()).isEqualTo(12345);
+        assertThat(httpOptions.isKeepAlive()).isFalse();
+    }
+
+    @Test
+    void testHttpOptionsAreIndependentFromSslOptions() {
+        WebClientOptions sslOptions = sslWebClientOptions().setMaxPoolSize(20);
+        WebClientOptions httpOptions = httpWebClientOptions(sslOptions);
+
+        sslOptions.setMaxPoolSize(40);
+
+        assertThat(httpOptions.getMaxPoolSize()).isEqualTo(20);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org