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