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

davsclaus pushed a commit to branch camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 62cce95b8434389573e6058822c6303a38c847ae
Author: Dennis Schwarz <mcint...@gmx.net>
AuthorDate: Wed Jan 18 13:46:02 2023 +0100

    CAMEL-14008 Another try to add a connection pool to camel-as2 (#9143)
    
    * CAMEL-14008 Another try to add a connection pool to camel-as2
    
    * Using ObjectHelper.notNull instead of Args.notNull, as requested by 
davsclaus
    
    * Replaced all Args.notNull by ObjectHelper.notNull
---
 .../as2/api/AS2AsynchronousMDNManager.java         |  6 +-
 .../component/as2/api/AS2ClientConnection.java     | 95 ++++++++++++++++++----
 .../camel/component/as2/api/AS2ClientManager.java  | 21 +++--
 .../component/as2/api/AS2ServerConnection.java     | 10 +--
 .../AS2MessageDispositionNotificationEntity.java   |  6 +-
 .../as2/api/entity/ApplicationEDIEntity.java       |  6 +-
 .../ApplicationPkcs7MimeCompressedDataEntity.java  |  4 +-
 .../ApplicationPkcs7MimeEnvelopedDataEntity.java   |  4 +-
 .../entity/ApplicationPkcs7SignatureEntity.java    |  8 +-
 ...spositionNotificationMultipartReportEntity.java |  8 +-
 .../DispositionNotificationOptionsParser.java      |  6 +-
 .../component/as2/api/entity/EntityParser.java     | 53 ++++++------
 .../camel/component/as2/api/entity/MimeEntity.java |  6 +-
 .../component/as2/api/entity/TextPlainEntity.java  |  4 +-
 .../as2/api/io/AS2BHttpClientConnection.java       | 19 ++---
 .../as2/api/io/AS2SessionInputBuffer.java          |  5 +-
 .../component/as2/api/util/AS2HeaderUtils.java     | 12 +--
 .../util/DispositionNotificationContentUtils.java  |  6 +-
 .../component/as2/api/util/EncryptingUtils.java    |  6 +-
 .../camel/component/as2/api/util/EntityUtils.java  | 16 ++--
 .../component/as2/api/util/HttpMessageUtils.java   | 16 ++--
 .../camel/component/as2/api/util/SigningUtils.java |  6 +-
 .../camel/component/as2/api/AS2MessageTest.java    | 62 +++++---------
 ...ientManagerEndpointConfigurationConfigurer.java | 28 +++++++
 .../component/as2/AS2ConfigurationConfigurer.java  | 28 +++++++
 .../camel/component/as2/AS2EndpointConfigurer.java | 28 +++++++
 .../camel/component/as2/AS2EndpointUriFactory.java |  6 +-
 ...rverManagerEndpointConfigurationConfigurer.java | 28 +++++++
 .../org/apache/camel/component/as2/as2.json        |  4 +
 .../camel/component/as2/AS2Configuration.java      | 54 ++++++++++++
 .../apache/camel/component/as2/AS2Producer.java    |  4 +-
 .../as2/internal/AS2ConnectionHelper.java          |  4 +-
 .../camel/component/as2/AS2ServerManagerIT.java    | 25 ++++--
 33 files changed, 416 insertions(+), 178 deletions(-)

diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2AsynchronousMDNManager.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2AsynchronousMDNManager.java
index cb38bb0299c..6b4addf8f61 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2AsynchronousMDNManager.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2AsynchronousMDNManager.java
@@ -26,6 +26,7 @@ import java.security.cert.Certificate;
 import 
org.apache.camel.component.as2.api.entity.DispositionNotificationMultipartReportEntity;
 import org.apache.camel.component.as2.api.protocol.RequestAsynchronousMDN;
 import org.apache.camel.component.as2.api.util.EntityUtils;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
@@ -43,7 +44,6 @@ import org.apache.http.protocol.RequestDate;
 import org.apache.http.protocol.RequestExpectContinue;
 import org.apache.http.protocol.RequestTargetHost;
 import org.apache.http.protocol.RequestUserAgent;
-import org.apache.http.util.Args;
 
 public class AS2AsynchronousMDNManager {
 
@@ -107,8 +107,8 @@ public class AS2AsynchronousMDNManager {
             DispositionNotificationMultipartReportEntity mdn,
             String recipientDeliveryAddress)
             throws HttpException {
-        Args.notNull(mdn, "mdn");
-        Args.notNull(recipientDeliveryAddress, "recipientDeliveryAddress");
+        ObjectHelper.notNull(mdn, "mdn");
+        ObjectHelper.notNull(recipientDeliveryAddress, 
"recipientDeliveryAddress");
 
         URI uri = null;
         try {
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java
index dd86e9744ba..9f1e8a86c8e 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java
@@ -18,15 +18,30 @@ package org.apache.camel.component.as2.api;
 
 import java.io.IOException;
 import java.net.Socket;
+import java.time.Duration;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.component.as2.api.io.AS2BHttpClientConnection;
 import org.apache.camel.component.as2.api.protocol.RequestAS2;
 import org.apache.camel.component.as2.api.protocol.RequestMDN;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.http.Header;
+import org.apache.http.HeaderElement;
+import org.apache.http.HttpClientConnection;
 import org.apache.http.HttpException;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
-import org.apache.http.impl.DefaultBHttpClientConnection;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.conn.ConnectionKeepAliveStrategy;
+import org.apache.http.conn.HttpConnectionFactory;
+import org.apache.http.conn.ManagedHttpClientConnection;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.protocol.HTTP;
 import org.apache.http.protocol.HttpCoreContext;
 import org.apache.http.protocol.HttpProcessor;
 import org.apache.http.protocol.HttpProcessorBuilder;
@@ -37,25 +52,34 @@ import org.apache.http.protocol.RequestDate;
 import org.apache.http.protocol.RequestExpectContinue;
 import org.apache.http.protocol.RequestTargetHost;
 import org.apache.http.protocol.RequestUserAgent;
-import org.apache.http.util.Args;
 
 public class AS2ClientConnection {
 
+    private static final int RETRIEVE_FROM_CONNECTION_POOL_TIMEOUT_SECONDS = 5;
+
     private HttpHost targetHost;
     private HttpProcessor httpProcessor;
-    private DefaultBHttpClientConnection httpConnection;
     private String as2Version;
     private String userAgent;
     private String clientFqdn;
+    private int connectionTimeoutMilliseconds;
+    private PoolingHttpClientConnectionManager connectionPoolManager;
+    private ConnectionKeepAliveStrategy connectionKeepAliveStrategy;
 
     public AS2ClientConnection(String as2Version, String userAgent, String 
clientFqdn, String targetHostName,
-                               Integer targetPortNumber) throws IOException {
+                               Integer targetPortNumber, Duration 
socketTimeout, Duration connectionTimeout,
+                               Integer connectionPoolMaxSize, Duration 
connectionPoolTtl) throws IOException {
 
-        this.as2Version = Args.notNull(as2Version, "as2Version");
-        this.userAgent = Args.notNull(userAgent, "userAgent");
-        this.clientFqdn = Args.notNull(clientFqdn, "clientFqdn");
+        this.as2Version = ObjectHelper.notNull(as2Version, "as2Version");
+        this.userAgent = ObjectHelper.notNull(userAgent, "userAgent");
+        this.clientFqdn = ObjectHelper.notNull(clientFqdn, "clientFqdn");
         this.targetHost = new HttpHost(
-                Args.notNull(targetHostName, "targetHostName"), 
Args.notNull(targetPortNumber, "targetPortNumber"));
+                ObjectHelper.notNull(targetHostName, "targetHostName"),
+                ObjectHelper.notNull(targetPortNumber, "targetPortNumber"));
+        ObjectHelper.notNull(socketTimeout, "socketTimeout");
+        this.connectionTimeoutMilliseconds = (int) 
ObjectHelper.notNull(connectionTimeout, "connectionTimeout").toMillis();
+        ObjectHelper.notNull(connectionPoolMaxSize, "connectionPoolMaxSize");
+        ObjectHelper.notNull(connectionPoolTtl, "connectionPoolTtl");
 
         // Build Processor
         httpProcessor = HttpProcessorBuilder.create()
@@ -68,12 +92,43 @@ public class AS2ClientConnection {
                 .add(new RequestConnControl())
                 .add(new RequestExpectContinue(true)).build();
 
-        // Create Socket
-        Socket socket = new Socket(targetHost.getHostName(), 
targetHost.getPort());
+        HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> 
connFactory = new HttpConnectionFactory<>() {
+            @Override
+            public AS2BHttpClientConnection create(HttpRoute route, 
ConnectionConfig config) {
+                return new 
AS2BHttpClientConnection(UUID.randomUUID().toString(), 8 * 1024);
+            }
+        };
+
+        connectionPoolManager = new 
PoolingHttpClientConnectionManager(connFactory);
+        connectionPoolManager.setMaxTotal(connectionPoolMaxSize);
+        connectionPoolManager.setSocketConfig(targetHost,
+                SocketConfig.copy(SocketConfig.DEFAULT)
+                        .setSoTimeout((int) socketTimeout.toMillis())
+                        .build());
+
+        connectionKeepAliveStrategy = (response, context) -> {
+            int ttl = (int) connectionPoolTtl.toMillis();
+            for (Header h : response.getAllHeaders()) {
+                if (HTTP.CONN_DIRECTIVE.equalsIgnoreCase(h.getName())) {
+                    if (HTTP.CONN_CLOSE.equalsIgnoreCase(h.getValue())) {
+                        ttl = -1;
+                    }
+                }
+                if (HTTP.CONN_KEEP_ALIVE.equalsIgnoreCase(h.getName())) {
+                    HeaderElement headerElement = h.getElements()[0];
+                    if (headerElement.getValue() != null && 
"timeout".equalsIgnoreCase(headerElement.getName())) {
+                        ttl = Integer.parseInt(headerElement.getValue()) * 
1000;
+                    }
+                }
+            }
+            return ttl;
+        };
+
+        // Check if a connection can be established
+        try (AS2BHttpClientConnection testConnection = new 
AS2BHttpClientConnection("test", 8 * 1024)) {
+            testConnection.bind(new Socket(targetHost.getHostName(), 
targetHost.getPort()));
+        }
 
-        // Create Connection
-        httpConnection = new AS2BHttpClientConnection(8 * 1024);
-        httpConnection.bind(socket);
     }
 
     public String getAs2Version() {
@@ -88,15 +143,27 @@ public class AS2ClientConnection {
         return clientFqdn;
     }
 
-    public HttpResponse send(HttpRequest request, HttpCoreContext httpContext) 
throws HttpException, IOException {
+    public HttpResponse send(HttpRequest request, HttpCoreContext httpContext)
+            throws HttpException, IOException, InterruptedException, 
ExecutionException {
+
+        HttpRoute route = new HttpRoute(targetHost);
 
         httpContext.setTargetHost(targetHost);
 
+        HttpClientConnection httpConnection = 
connectionPoolManager.requestConnection(route, null)
+                .get(RETRIEVE_FROM_CONNECTION_POOL_TIMEOUT_SECONDS, 
TimeUnit.SECONDS);
+        if (!httpConnection.isOpen()) {
+            connectionPoolManager.connect(httpConnection, route, 
connectionTimeoutMilliseconds, httpContext);
+        }
+
         // Execute Request
         HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
         httpexecutor.preProcess(request, httpProcessor, httpContext);
         HttpResponse response = httpexecutor.execute(request, httpConnection, 
httpContext);
         httpexecutor.postProcess(response, httpProcessor, httpContext);
+        connectionPoolManager.routeComplete(httpConnection, route, 
httpContext);
+        connectionPoolManager.releaseConnection(httpConnection, null,
+                connectionKeepAliveStrategy.getKeepAliveDuration(response, 
httpContext), TimeUnit.MILLISECONDS);
 
         return response;
     }
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java
index eed4893c710..1b5df6d90be 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.security.PrivateKey;
 import java.security.cert.Certificate;
+import java.util.concurrent.ExecutionException;
 
 import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity;
 import 
org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeCompressedDataEntity;
@@ -30,12 +31,12 @@ import 
org.apache.camel.component.as2.api.util.CompressionUtils;
 import org.apache.camel.component.as2.api.util.EncryptingUtils;
 import org.apache.camel.component.as2.api.util.EntityUtils;
 import org.apache.camel.component.as2.api.util.SigningUtils;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.HttpException;
 import org.apache.http.HttpResponse;
 import org.apache.http.entity.ContentType;
 import org.apache.http.message.BasicHttpEntityEnclosingRequest;
 import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.util.Args;
 import org.bouncycastle.cms.CMSCompressedDataGenerator;
 import org.bouncycastle.cms.CMSEnvelopedDataGenerator;
 import org.bouncycastle.operator.OutputCompressor;
@@ -216,14 +217,14 @@ public class AS2ClientManager {
             String attachedFileName)
             throws HttpException {
 
-        Args.notNull(ediMessage, "EDI Message");
-        Args.notNull(requestUri, "Request URI");
-        Args.notNull(subject, "Subject");
-        Args.notNull(from, "Subject");
-        Args.notNull(as2From, "Subject");
-        Args.notNull(as2To, "Subject");
-        Args.notNull(as2MessageStructure, "AS2 Message Structure");
-        Args.notNull(ediMessageContentType, "EDI Message Content Type");
+        ObjectHelper.notNull(ediMessage, "EDI Message");
+        ObjectHelper.notNull(requestUri, "Request URI");
+        ObjectHelper.notNull(subject, "Subject");
+        ObjectHelper.notNull(from, "Subject");
+        ObjectHelper.notNull(as2From, "Subject");
+        ObjectHelper.notNull(as2To, "Subject");
+        ObjectHelper.notNull(as2MessageStructure, "AS2 Message Structure");
+        ObjectHelper.notNull(ediMessageContentType, "EDI Message Content 
Type");
 
         // Add Context attributes
         HttpCoreContext httpContext = HttpCoreContext.create();
@@ -391,6 +392,8 @@ public class AS2ClientManager {
             EntityParser.parseAS2MessageEntity(response);
         } catch (IOException e) {
             throw new HttpException("Failed to send http request message", e);
+        } catch (ExecutionException | InterruptedException ex) {
+            throw new HttpException("Retrieving connection from Pool failed or 
timed out", ex);
         }
         httpContext.setAttribute(HTTP_RESPONSE, response);
         return httpContext;
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ServerConnection.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ServerConnection.java
index 8ac46bc0099..1dd94f28483 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ServerConnection.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ServerConnection.java
@@ -27,6 +27,7 @@ import java.security.cert.Certificate;
 import 
org.apache.camel.component.as2.api.entity.DispositionNotificationMultipartReportEntity;
 import org.apache.camel.component.as2.api.io.AS2BHttpServerConnection;
 import org.apache.camel.component.as2.api.protocol.ResponseMDN;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.ConnectionClosedException;
 import org.apache.http.HttpException;
 import org.apache.http.HttpInetConnection;
@@ -43,7 +44,6 @@ import org.apache.http.protocol.ResponseContent;
 import org.apache.http.protocol.ResponseDate;
 import org.apache.http.protocol.ResponseServer;
 import org.apache.http.protocol.UriHttpRequestHandlerMapper;
-import org.apache.http.util.Args;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -205,10 +205,10 @@ public class AS2ServerConnection {
                                PrivateKey decryptingPrivateKey,
                                String mdnMessageTemplate)
                                                           throws IOException {
-        this.as2Version = Args.notNull(as2Version, "as2Version");
-        this.originServer = Args.notNull(originServer, "userAgent");
-        this.serverFqdn = Args.notNull(serverFqdn, "serverFqdn");
-        this.serverPortNumber = Args.notNull(serverPortNumber, 
"serverPortNumber");
+        this.as2Version = ObjectHelper.notNull(as2Version, "as2Version");
+        this.originServer = ObjectHelper.notNull(originServer, "userAgent");
+        this.serverFqdn = ObjectHelper.notNull(serverFqdn, "serverFqdn");
+        this.serverPortNumber = ObjectHelper.notNull(serverPortNumber, 
"serverPortNumber");
         this.signingAlgorithm = signingAlgorithm;
         this.signingCertificateChain = signingCertificateChain;
         this.signingPrivateKey = signingPrivateKey;
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/AS2MessageDispositionNotificationEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/AS2MessageDispositionNotificationEntity.java
index 13d141fbae2..31789498555 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/AS2MessageDispositionNotificationEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/AS2MessageDispositionNotificationEntity.java
@@ -30,6 +30,7 @@ import 
org.apache.camel.component.as2.api.CanonicalOutputStream;
 import org.apache.camel.component.as2.api.util.HttpMessageUtils;
 import org.apache.camel.component.as2.api.util.MicUtils;
 import org.apache.camel.component.as2.api.util.MicUtils.ReceivedContentMic;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.HttpEntityEnclosingRequest;
@@ -37,7 +38,6 @@ import org.apache.http.HttpException;
 import org.apache.http.HttpResponse;
 import org.apache.http.entity.ContentType;
 import org.apache.http.message.BasicHeader;
-import org.apache.http.util.Args;
 
 public class AS2MessageDispositionNotificationEntity extends MimeEntity {
 
@@ -93,8 +93,8 @@ public class AS2MessageDispositionNotificationEntity extends 
MimeEntity {
 
         this.reportingUA = HttpMessageUtils.getHeaderValue(response, 
AS2Header.SERVER);
 
-        this.dispositionMode = Args.notNull(dispositionMode, "Disposition 
Mode");
-        this.dispositionType = Args.notNull(dispositionType, "Disposition 
Type");
+        this.dispositionMode = ObjectHelper.notNull(dispositionMode, 
"Disposition Mode");
+        this.dispositionType = ObjectHelper.notNull(dispositionType, 
"Disposition Type");
         this.dispositionModifier = dispositionModifier;
         this.failureFields = failureFields;
         this.errorFields = errorFields;
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEDIEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEDIEntity.java
index fe2671933fc..77c06203c56 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEDIEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEDIEntity.java
@@ -23,11 +23,11 @@ import java.nio.charset.StandardCharsets;
 import org.apache.camel.component.as2.api.AS2Header;
 import org.apache.camel.component.as2.api.CanonicalOutputStream;
 import org.apache.camel.component.as2.api.util.EntityUtils;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.entity.ContentType;
-import org.apache.http.util.Args;
 import org.slf4j.helpers.MessageFormatter;
 
 public abstract class ApplicationEDIEntity extends MimeEntity {
@@ -38,8 +38,8 @@ public abstract class ApplicationEDIEntity extends MimeEntity 
{
 
     protected ApplicationEDIEntity(String ediMessage, ContentType contentType, 
String contentTransferEncoding,
                                    boolean isMainBody, String filename) {
-        this.ediMessage = Args.notNull(ediMessage, "EDI Message");
-        setContentType(Args.notNull(contentType, "Content Type").toString());
+        this.ediMessage = ObjectHelper.notNull(ediMessage, "EDI Message");
+        setContentType(ObjectHelper.notNull(contentType, "Content 
Type").toString());
         setContentTransferEncoding(contentTransferEncoding);
         setMainBody(isMainBody);
         if (StringUtils.isNotBlank(filename)) {
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java
index 1f05f56218f..75f7af008ba 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java
@@ -24,12 +24,12 @@ import java.nio.charset.StandardCharsets;
 import org.apache.camel.component.as2.api.AS2Header;
 import org.apache.camel.component.as2.api.CanonicalOutputStream;
 import org.apache.camel.component.as2.api.util.EntityUtils;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.HttpException;
 import org.apache.http.entity.ContentType;
 import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.util.Args;
 import org.bouncycastle.cms.CMSCompressedData;
 import org.bouncycastle.cms.CMSCompressedDataGenerator;
 import org.bouncycastle.cms.CMSException;
@@ -64,7 +64,7 @@ public class ApplicationPkcs7MimeCompressedDataEntity extends 
MimeEntity {
 
     public ApplicationPkcs7MimeCompressedDataEntity(byte[] compressedData, 
String compressedContentTransferEncoding,
                                                     boolean isMainBody) {
-        this.compressedData = Args.notNull(compressedData, "encryptedData");
+        this.compressedData = ObjectHelper.notNull(compressedData, 
"encryptedData");
 
         setContentType(ContentType.create("application/pkcs7-mime", new 
BasicNameValuePair("smime-type", "compressed-data"),
                 new BasicNameValuePair("name", "smime.p7z")));
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java
index 21b53c7a89e..e2ef7b4352b 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java
@@ -25,12 +25,12 @@ import java.security.PrivateKey;
 import org.apache.camel.component.as2.api.AS2Header;
 import org.apache.camel.component.as2.api.CanonicalOutputStream;
 import org.apache.camel.component.as2.api.util.EntityUtils;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.HttpException;
 import org.apache.http.entity.ContentType;
 import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.util.Args;
 import org.bouncycastle.cms.CMSEnvelopedData;
 import org.bouncycastle.cms.CMSEnvelopedDataGenerator;
 import org.bouncycastle.cms.CMSException;
@@ -64,7 +64,7 @@ public class ApplicationPkcs7MimeEnvelopedDataEntity extends 
MimeEntity {
 
     public ApplicationPkcs7MimeEnvelopedDataEntity(byte[] encryptedData, 
String encryptedContentTransferEncoding,
                                                    boolean isMainBody) {
-        this.encryptedData = Args.notNull(encryptedData, "encryptedData");
+        this.encryptedData = ObjectHelper.notNull(encryptedData, 
"encryptedData");
 
         setContentType(ContentType.create("application/pkcs7-mime", new 
BasicNameValuePair("smime-type", "enveloped-data"),
                 new BasicNameValuePair("name", "smime.p7m")));
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7SignatureEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7SignatureEntity.java
index 35e52fe6b95..686bdaa8b2d 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7SignatureEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7SignatureEntity.java
@@ -25,11 +25,11 @@ import org.apache.camel.component.as2.api.AS2Header;
 import org.apache.camel.component.as2.api.AS2MediaType;
 import org.apache.camel.component.as2.api.CanonicalOutputStream;
 import org.apache.camel.component.as2.api.util.EntityUtils;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.HttpException;
 import org.apache.http.entity.ContentType;
-import org.apache.http.util.Args;
 import org.bouncycastle.cms.CMSException;
 import org.bouncycastle.cms.CMSProcessableByteArray;
 import org.bouncycastle.cms.CMSSignedData;
@@ -46,8 +46,8 @@ public class ApplicationPkcs7SignatureEntity extends 
MimeEntity {
 
     public ApplicationPkcs7SignatureEntity(MimeEntity data, 
CMSSignedDataGenerator signer, String charset,
                                            String contentTransferEncoding, 
boolean isMainBody) throws HttpException {
-        Args.notNull(data, "Data");
-        Args.notNull(signer, "Signer");
+        ObjectHelper.notNull(data, "Data");
+        ObjectHelper.notNull(signer, "Signer");
 
         ContentType contentType
                 = 
ContentType.parse(EntityUtils.appendParameter(AS2MediaType.APPLICATION_PKCS7_SIGNATURE,
 "charset", charset));
@@ -67,7 +67,7 @@ public class ApplicationPkcs7SignatureEntity extends 
MimeEntity {
                                            String charset,
                                            String contentTransferEncoding,
                                            boolean isMainBody) {
-        this.signature = Args.notNull(signature, "signature");
+        this.signature = ObjectHelper.notNull(signature, "signature");
 
         ContentType contentType = ContentType
                 
.parse(EntityUtils.appendParameter(AS2MediaType.APPLICATION_PKCS7_SIGNATURE, 
"charset", charset));
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationMultipartReportEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationMultipartReportEntity.java
index fbfe1e64e8c..b94b8ab60e4 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationMultipartReportEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationMultipartReportEntity.java
@@ -23,11 +23,11 @@ import java.util.Map;
 import org.apache.camel.component.as2.api.AS2Header;
 import org.apache.camel.component.as2.api.AS2MimeType;
 import org.apache.camel.component.as2.api.AS2TransferEncoding;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpException;
 import org.apache.http.HttpResponse;
 import org.apache.http.entity.ContentType;
-import org.apache.http.util.Args;
 
 public class DispositionNotificationMultipartReportEntity extends 
MultipartReportEntity {
 
@@ -56,9 +56,9 @@ public class DispositionNotificationMultipartReportEntity 
extends MultipartRepor
         super(charset, isMainBody, boundary);
         removeHeaders(AS2Header.CONTENT_TYPE);
         setContentType(getContentTypeValue(boundary));
-        Args.notNull(dispositionMode, "dispositionMode");
-        Args.notNull(dispositionType, "dispositionType");
-        Args.notNull(mdnMessage, "mdnMessageTemplate");
+        ObjectHelper.notNull(dispositionMode, "dispositionMode");
+        ObjectHelper.notNull(dispositionType, "dispositionType");
+        ObjectHelper.notNull(mdnMessage, "mdnMessageTemplate");
 
         addPart(buildPlainTextReport(mdnMessage));
         addPart(new AS2MessageDispositionNotificationEntity(
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationOptionsParser.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationOptionsParser.java
index 2fb6e1bfd4c..f9c4fdd50f0 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationOptionsParser.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/DispositionNotificationOptionsParser.java
@@ -21,9 +21,9 @@ import java.util.Map;
 
 import org.apache.camel.component.as2.api.util.AS2HeaderUtils;
 import org.apache.camel.component.as2.api.util.AS2HeaderUtils.Parameter;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.ParseException;
 import org.apache.http.message.ParserCursor;
-import org.apache.http.util.Args;
 import org.apache.http.util.CharArrayBuffer;
 
 public class DispositionNotificationOptionsParser {
@@ -51,8 +51,8 @@ public class DispositionNotificationOptionsParser {
     public DispositionNotificationOptions parseDispositionNotificationOptions(
             final CharArrayBuffer buffer,
             final ParserCursor cursor) {
-        Args.notNull(buffer, "buffer");
-        Args.notNull(cursor, "cursor");
+        ObjectHelper.notNull(buffer, "buffer");
+        ObjectHelper.notNull(cursor, "cursor");
 
         Map<String, Parameter> parameters = new HashMap<>();
         while (!cursor.atEnd()) {
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java
index 01b4c7398cc..605e15cce18 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java
@@ -38,6 +38,7 @@ import 
org.apache.camel.component.as2.api.util.ContentTypeUtils;
 import 
org.apache.camel.component.as2.api.util.DispositionNotificationContentUtils;
 import org.apache.camel.component.as2.api.util.EntityUtils;
 import org.apache.camel.component.as2.api.util.HttpMessageUtils;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.codec.DecoderException;
 import org.apache.http.Header;
 import org.apache.http.HttpEntity;
@@ -72,8 +73,8 @@ public final class EntityParser {
     }
 
     public static boolean isBoundaryCloseDelimiter(final CharArrayBuffer 
buffer, ParserCursor cursor, String boundary) {
-        Args.notNull(buffer, "Buffer");
-        Args.notNull(boundary, "Boundary");
+        ObjectHelper.notNull(buffer, "Buffer");
+        ObjectHelper.notNull(boundary, "Boundary");
 
         String boundaryCloseDelimiter = "--" + boundary + "--"; // boundary
         // close-delimiter
@@ -101,8 +102,8 @@ public final class EntityParser {
     }
 
     public static boolean isBoundaryDelimiter(final CharArrayBuffer buffer, 
ParserCursor cursor, String boundary) {
-        Args.notNull(buffer, "Buffer");
-        Args.notNull(boundary, "Boundary");
+        ObjectHelper.notNull(buffer, "Buffer");
+        ObjectHelper.notNull(boundary, "Boundary");
 
         String boundaryDelimiter = "--" + boundary; // boundary delimiter -
         // RFC2046 5.1.1
@@ -269,10 +270,10 @@ public final class EntityParser {
             throws HttpException {
         ApplicationPkcs7MimeCompressedDataEntity 
applicationPkcs7MimeCompressedDataEntity = null;
 
-        Args.notNull(message, "message");
-        Args.notNull(inBuffer, "inBuffer");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(inBuffer, "inBuffer");
 
-        HttpEntity entity = 
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
+        HttpEntity entity = 
ObjectHelper.notNull(EntityUtils.getMessageEntity(message), "message entity");
 
         if (entity instanceof ApplicationPkcs7MimeCompressedDataEntity) {
             // already parsed
@@ -299,10 +300,10 @@ public final class EntityParser {
             throws HttpException {
         ApplicationPkcs7MimeEnvelopedDataEntity 
applicationPkcs7MimeEnvelopedDataEntity = null;
 
-        Args.notNull(message, "message");
-        Args.notNull(inBuffer, "inBuffer");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(inBuffer, "inBuffer");
 
-        HttpEntity entity = 
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
+        HttpEntity entity = 
ObjectHelper.notNull(EntityUtils.getMessageEntity(message), "message entity");
 
         if (entity instanceof ApplicationPkcs7MimeCompressedDataEntity) {
             // already parsed
@@ -330,12 +331,12 @@ public final class EntityParser {
             throws HttpException {
         MultipartSignedEntity multipartSignedEntity = null;
 
-        Args.notNull(message, "message");
-        Args.notNull(inBuffer, "inBuffer");
-        Args.notNull(boundary, "boundary");
-        Args.notNull(charsetName, "charsetName");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(inBuffer, "inBuffer");
+        ObjectHelper.notNull(boundary, "boundary");
+        ObjectHelper.notNull(charsetName, "charsetName");
 
-        HttpEntity entity = 
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
+        HttpEntity entity = 
ObjectHelper.notNull(EntityUtils.getMessageEntity(message), "message entity");
 
         if (entity instanceof MultipartSignedEntity) {
             // already parsed
@@ -370,10 +371,10 @@ public final class EntityParser {
             throws HttpException {
         ApplicationEDIEntity applicationEDIEntity = null;
 
-        Args.notNull(message, "message");
-        Args.notNull(inBuffer, "inBuffer");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(inBuffer, "inBuffer");
 
-        HttpEntity entity = 
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
+        HttpEntity entity = 
ObjectHelper.notNull(EntityUtils.getMessageEntity(message), "message entity");
 
         if (entity instanceof ApplicationEDIEntity) {
             // already parsed
@@ -400,11 +401,11 @@ public final class EntityParser {
             throws HttpException {
         DispositionNotificationMultipartReportEntity 
dispositionNotificationMultipartReportEntity = null;
 
-        Args.notNull(message, "message");
-        Args.notNull(inBuffer, "inBuffer");
-        Args.notNull(boundary, "boundary");
-        Args.notNull(charsetName, "charsetName");
-        HttpEntity entity = 
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(inBuffer, "inBuffer");
+        ObjectHelper.notNull(boundary, "boundary");
+        ObjectHelper.notNull(charsetName, "charsetName");
+        HttpEntity entity = 
ObjectHelper.notNull(EntityUtils.getMessageEntity(message), "message entity");
 
         if (entity instanceof DispositionNotificationMultipartReportEntity) {
             // already parsed
@@ -433,7 +434,7 @@ public final class EntityParser {
      */
     public static void parseAS2MessageEntity(HttpMessage message) throws 
HttpException {
         if (EntityUtils.hasEntity(message)) {
-            HttpEntity entity = 
Args.notNull(EntityUtils.getMessageEntity(message), "message entity");
+            HttpEntity entity = 
ObjectHelper.notNull(EntityUtils.getMessageEntity(message), "message entity");
 
             if (entity instanceof MimeEntity) {
                 // already parsed
@@ -1037,8 +1038,8 @@ public final class EntityParser {
             final LineParser parser,
             final List<CharArrayBuffer> fields)
             throws IOException {
-        Args.notNull(parser, "parser");
-        Args.notNull(fields, "fields");
+        ObjectHelper.notNull(parser, "parser");
+        ObjectHelper.notNull(fields, "fields");
         CharArrayBuffer current = null;
         CharArrayBuffer previous = null;
         while (true) {
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java
index ef2732e98d1..eecca6784bf 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java
@@ -26,6 +26,7 @@ import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.camel.component.as2.api.AS2Header;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.entity.AbstractHttpEntity;
@@ -33,7 +34,6 @@ import org.apache.http.entity.ContentType;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.message.HeaderGroup;
 import org.apache.http.protocol.HTTP;
-import org.apache.http.util.Args;
 
 public abstract class MimeEntity extends AbstractHttpEntity {
 
@@ -190,7 +190,7 @@ public abstract class MimeEntity extends AbstractHttpEntity 
{
     }
 
     public void addHeader(final String name, final String value) {
-        Args.notNull(name, "Header name");
+        ObjectHelper.notNull(name, "Header name");
         this.headergroup.addHeader(new BasicHeader(name, value));
     }
 
@@ -199,7 +199,7 @@ public abstract class MimeEntity extends AbstractHttpEntity 
{
     }
 
     public void setHeader(final String name, final String value) {
-        Args.notNull(name, "Header name");
+        ObjectHelper.notNull(name, "Header name");
         this.headergroup.updateHeader(new BasicHeader(name, value));
     }
 
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/TextPlainEntity.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/TextPlainEntity.java
index a84146cda7b..877e643b93a 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/TextPlainEntity.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/TextPlainEntity.java
@@ -22,17 +22,17 @@ import java.nio.charset.StandardCharsets;
 
 import org.apache.camel.component.as2.api.AS2MediaType;
 import org.apache.camel.component.as2.api.CanonicalOutputStream;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.entity.ContentType;
-import org.apache.http.util.Args;
 
 public class TextPlainEntity extends MimeEntity {
 
     private String content;
 
     public TextPlainEntity(String content, String charset, String 
contentTransferEncoding, boolean isMainBody) {
-        this.content = Args.notNull(content, "Content");
+        this.content = ObjectHelper.notNull(content, "Content");
         setContentType(ContentType.create(AS2MediaType.TEXT_PLAIN, charset));
         setContentTransferEncoding(contentTransferEncoding);
         setMainBody(isMainBody);
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2BHttpClientConnection.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2BHttpClientConnection.java
index f0a50a9c94f..88712ec2bfc 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2BHttpClientConnection.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2BHttpClientConnection.java
@@ -26,20 +26,13 @@ import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.config.MessageConstraints;
 import org.apache.http.entity.ContentLengthStrategy;
-import org.apache.http.impl.DefaultBHttpClientConnection;
+import org.apache.http.impl.conn.DefaultManagedHttpClientConnection;
 import org.apache.http.io.HttpMessageParserFactory;
 import org.apache.http.io.HttpMessageWriterFactory;
 
-public class AS2BHttpClientConnection extends DefaultBHttpClientConnection {
+public class AS2BHttpClientConnection extends 
DefaultManagedHttpClientConnection {
 
-    public AS2BHttpClientConnection(int buffersize,
-                                    CharsetDecoder chardecoder,
-                                    CharsetEncoder charencoder,
-                                    MessageConstraints constraints) {
-        super(buffersize, chardecoder, charencoder, constraints);
-    }
-
-    public AS2BHttpClientConnection(int buffersize,
+    public AS2BHttpClientConnection(String id, int buffersize,
                                     int fragmentSizeHint,
                                     CharsetDecoder chardecoder,
                                     CharsetEncoder charencoder,
@@ -48,12 +41,12 @@ public class AS2BHttpClientConnection extends 
DefaultBHttpClientConnection {
                                     ContentLengthStrategy 
outgoingContentStrategy,
                                     HttpMessageWriterFactory<HttpRequest> 
requestWriterFactory,
                                     HttpMessageParserFactory<HttpResponse> 
responseParserFactory) {
-        super(buffersize, fragmentSizeHint, chardecoder, charencoder, 
constraints, incomingContentStrategy,
+        super(id, buffersize, fragmentSizeHint, chardecoder, charencoder, 
constraints, incomingContentStrategy,
               outgoingContentStrategy, requestWriterFactory, 
responseParserFactory);
     }
 
-    public AS2BHttpClientConnection(int buffersize) {
-        super(buffersize);
+    public AS2BHttpClientConnection(String id, int buffersize) {
+        super(id, buffersize);
     }
 
     @Override
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java
index 2936cf0b158..a523c720a08 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java
@@ -23,6 +23,7 @@ import java.nio.CharBuffer;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.CoderResult;
 
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.MessageConstraintException;
 import org.apache.http.config.MessageConstraints;
 import org.apache.http.impl.io.HttpTransportMetricsImpl;
@@ -59,7 +60,7 @@ public class AS2SessionInputBuffer implements 
SessionInputBuffer, BufferInfo {
                                  final int buffersize,
                                  final int minChunkLimit,
                                  MessageConstraints constraints) {
-        this.metrics = Args.notNull(metrics, "metrics");
+        this.metrics = ObjectHelper.notNull(metrics, "metrics");
         Args.positive(buffersize, "buffersize");
         this.buffer = new byte[buffersize];
         this.bufferpos = 0;
@@ -187,7 +188,7 @@ public class AS2SessionInputBuffer implements 
SessionInputBuffer, BufferInfo {
 
     @Override
     public int readLine(CharArrayBuffer charbuffer) throws IOException {
-        Args.notNull(charbuffer, "Char array buffer");
+        ObjectHelper.notNull(charbuffer, "Char array buffer");
         final int maxLineLen = this.constraints.getMaxLineLength();
         int noRead = 0;
         boolean retry = true;
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
index a180b514eeb..bfbcd7abda0 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
@@ -21,13 +21,13 @@ import java.util.BitSet;
 import java.util.List;
 
 import org.apache.camel.component.as2.api.entity.Importance;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderElement;
 import org.apache.http.NameValuePair;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.message.ParserCursor;
 import org.apache.http.message.TokenParser;
-import org.apache.http.util.Args;
 import org.apache.http.util.CharArrayBuffer;
 
 public final class AS2HeaderUtils {
@@ -38,7 +38,7 @@ public final class AS2HeaderUtils {
         private final String[] values;
 
         public Parameter(String attribute, String importance, String[] values) 
{
-            this.attribute = Args.notNull(attribute, "attribute");
+            this.attribute = ObjectHelper.notNull(attribute, "attribute");
             this.importance = Importance.get(importance);
             this.values = values;
         }
@@ -107,8 +107,8 @@ public final class AS2HeaderUtils {
     }
 
     public static Parameter parseParameter(final CharArrayBuffer buffer, final 
ParserCursor cursor) {
-        Args.notNull(buffer, "Char array buffer");
-        Args.notNull(cursor, "Parser cursor");
+        ObjectHelper.notNull(buffer, "Char array buffer");
+        ObjectHelper.notNull(cursor, "Parser cursor");
 
         final String name = TOKEN_PARSER.parseToken(buffer, cursor, 
TOKEN_DELIMS);
         if (cursor.atEnd()) {
@@ -146,8 +146,8 @@ public final class AS2HeaderUtils {
     }
 
     public static String getParameterValue(Header[] headers, String 
headerName, String parameterName) {
-        Args.notNull(headers, "headers");
-        Args.notNull(headerName, "headerName");
+        ObjectHelper.notNull(headers, "headers");
+        ObjectHelper.notNull(headerName, "headerName");
         for (Header header : headers) {
             if (header.getName().equalsIgnoreCase(headerName)) {
                 for (HeaderElement headerElement : header.getElements()) {
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/DispositionNotificationContentUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/DispositionNotificationContentUtils.java
index 995172dd95d..b5296c7f9d2 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/DispositionNotificationContentUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/DispositionNotificationContentUtils.java
@@ -29,10 +29,10 @@ import 
org.apache.camel.component.as2.api.entity.AS2MessageDispositionNotificati
 import org.apache.camel.component.as2.api.entity.DispositionMode;
 import 
org.apache.camel.component.as2.api.util.DispositionNotificationContentUtils.Field.Element;
 import org.apache.camel.component.as2.api.util.MicUtils.ReceivedContentMic;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.ParseException;
 import org.apache.http.message.ParserCursor;
 import org.apache.http.message.TokenParser;
-import org.apache.http.util.Args;
 import org.apache.http.util.CharArrayBuffer;
 
 public final class DispositionNotificationContentUtils {
@@ -78,12 +78,12 @@ public final class DispositionNotificationContentUtils {
         private Element[] elements;
 
         public Field(String name, Element[] elements) {
-            this.name = Args.notNull(name, "name");
+            this.name = ObjectHelper.notNull(name, "name");
             this.elements = (elements == null) ? new Element[] {} : elements;
         }
 
         public Field(String name, String value) {
-            this.name = Args.notNull(name, "name");
+            this.name = ObjectHelper.notNull(name, "name");
             this.elements = new Element[] { new Element(value, null) };
         }
 
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EncryptingUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EncryptingUtils.java
index dcfd8794b8a..7d01eb3c75a 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EncryptingUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EncryptingUtils.java
@@ -21,8 +21,8 @@ import java.security.cert.CertificateEncodingException;
 import java.security.cert.X509Certificate;
 
 import org.apache.camel.component.as2.api.AS2EncryptionAlgorithm;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.HttpException;
-import org.apache.http.util.Args;
 import org.bouncycastle.cms.CMSEnvelopedDataGenerator;
 import org.bouncycastle.cms.CMSException;
 import org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder;
@@ -36,7 +36,7 @@ public final class EncryptingUtils {
 
     public static CMSEnvelopedDataGenerator 
createEnvelopDataGenerator(Certificate[] encryptionCertificateChain)
             throws HttpException {
-        Args.notNull(encryptionCertificateChain, "encryptionCertificateChain");
+        ObjectHelper.notNull(encryptionCertificateChain, 
"encryptionCertificateChain");
         if (encryptionCertificateChain.length == 0 || 
!(encryptionCertificateChain[0] instanceof X509Certificate)) {
             throw new IllegalArgumentException("Invalid certificate chain");
         }
@@ -57,7 +57,7 @@ public final class EncryptingUtils {
     }
 
     public static OutputEncryptor createEncryptor(AS2EncryptionAlgorithm 
encryptionAlgorithm) throws HttpException {
-        Args.notNull(encryptionAlgorithm, "encryptionAlgorithmName");
+        ObjectHelper.notNull(encryptionAlgorithm, "encryptionAlgorithmName");
         try {
             return new 
JceCMSContentEncryptorBuilder(encryptionAlgorithm.getAlgorithmOID()).build();
         } catch (CMSException e) {
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
index a60cfae820d..d97fb78b769 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/EntityUtils.java
@@ -33,6 +33,7 @@ import 
org.apache.camel.component.as2.api.entity.ApplicationEDIEntity;
 import org.apache.camel.component.as2.api.entity.ApplicationEDIFACTEntity;
 import org.apache.camel.component.as2.api.entity.ApplicationEDIX12Entity;
 import org.apache.camel.component.as2.api.entity.MimeEntity;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.codec.DecoderException;
 import org.apache.commons.codec.binary.Base64InputStream;
 import org.apache.commons.codec.binary.Base64OutputStream;
@@ -43,7 +44,6 @@ import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpMessage;
 import org.apache.http.HttpResponse;
 import org.apache.http.entity.ContentType;
-import org.apache.http.util.Args;
 import org.bouncycastle.util.encoders.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -85,7 +85,7 @@ public final class EntityUtils {
     }
 
     public static byte[] encode(byte[] data, String encoding) throws 
CamelException {
-        Args.notNull(data, "Data");
+        ObjectHelper.notNull(data, "Data");
 
         if (encoding == null) {
             // Identity encoding
@@ -109,7 +109,7 @@ public final class EntityUtils {
     }
 
     public static OutputStream encode(OutputStream os, String encoding) throws 
CamelException {
-        Args.notNull(os, "Output Stream");
+        ObjectHelper.notNull(os, "Output Stream");
 
         if (encoding == null) {
             // Identity encoding
@@ -137,7 +137,7 @@ public final class EntityUtils {
     }
 
     public static byte[] decode(byte[] data, String encoding) throws 
CamelException, DecoderException {
-        Args.notNull(data, "Data");
+        ObjectHelper.notNull(data, "Data");
 
         if (encoding == null) {
             // Identity encoding
@@ -159,7 +159,7 @@ public final class EntityUtils {
     }
 
     public static InputStream decode(InputStream is, String encoding) throws 
CamelException {
-        Args.notNull(is, "Input Stream");
+        ObjectHelper.notNull(is, "Input Stream");
 
         if (encoding == null) {
             // Identity encoding
@@ -185,8 +185,8 @@ public final class EntityUtils {
             String ediMessage, ContentType ediMessageContentType, String 
contentTransferEncoding, boolean isMainBody,
             String filename)
             throws CamelException {
-        Args.notNull(ediMessage, "EDI Message");
-        Args.notNull(ediMessageContentType, "EDI Message Content Type");
+        ObjectHelper.notNull(ediMessage, "EDI Message");
+        ObjectHelper.notNull(ediMessageContentType, "EDI Message Content 
Type");
         String charset = null;
         if (ediMessageContentType.getCharset() != null) {
             charset = ediMessageContentType.getCharset().toString();
@@ -260,7 +260,7 @@ public final class EntityUtils {
             ContentType contentType,
             String bodyPartTransferEncoding)
             throws CamelException, DecoderException {
-        Args.notNull(bodyPartContent, "bodyPartContent");
+        ObjectHelper.notNull(bodyPartContent, "bodyPartContent");
         Charset contentCharset = contentType.getCharset();
         if (contentCharset == null) {
             contentCharset = StandardCharsets.US_ASCII;
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
index 4c05a9f1af4..e8068e9f7ec 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
@@ -27,6 +27,7 @@ import 
org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEnvelopedDa
 import org.apache.camel.component.as2.api.entity.EntityParser;
 import org.apache.camel.component.as2.api.entity.MimeEntity;
 import org.apache.camel.component.as2.api.entity.MultipartSignedEntity;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.Header;
 import org.apache.http.HeaderElement;
 import org.apache.http.HttpEntity;
@@ -37,7 +38,6 @@ import org.apache.http.HttpResponse;
 import org.apache.http.NameValuePair;
 import org.apache.http.entity.ContentType;
 import org.apache.http.io.SessionInputBuffer;
-import org.apache.http.util.Args;
 import org.apache.http.util.CharArrayBuffer;
 import org.bouncycastle.cms.jcajce.ZlibExpanderProvider;
 
@@ -52,8 +52,8 @@ public final class HttpMessageUtils {
     }
 
     public static void setHeaderValue(HttpMessage message, String headerName, 
String headerValue) {
-        Args.notNull(message, "message");
-        Args.notNull(headerName, "headerName");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(headerName, "headerName");
         if (headerValue == null) {
             message.removeHeaders(headerName);
         } else {
@@ -62,8 +62,8 @@ public final class HttpMessageUtils {
     }
 
     public static <T> T getEntity(HttpMessage message, Class<T> type) {
-        Args.notNull(message, "message");
-        Args.notNull(type, "type");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(type, "type");
         if (message instanceof HttpEntityEnclosingRequest) {
             HttpEntity entity = ((HttpEntityEnclosingRequest) 
message).getEntity();
             if (entity != null && type.isInstance(entity)) {
@@ -109,9 +109,9 @@ public final class HttpMessageUtils {
     }
 
     public static String getParameterValue(HttpMessage message, String 
headerName, String parameterName) {
-        Args.notNull(message, "message");
-        Args.notNull(headerName, "headerName");
-        Args.notNull(parameterName, "parameterName");
+        ObjectHelper.notNull(message, "message");
+        ObjectHelper.notNull(headerName, "headerName");
+        ObjectHelper.notNull(parameterName, "parameterName");
         Header header = message.getFirstHeader(headerName);
         if (header == null) {
             return null;
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
index 61b04128cf8..7a17387a1ef 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/SigningUtils.java
@@ -24,8 +24,8 @@ import java.util.Arrays;
 
 import org.apache.camel.component.as2.api.AS2SignatureAlgorithm;
 import org.apache.camel.component.as2.api.AS2SignedDataGenerator;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.HttpException;
-import org.apache.http.util.Args;
 import org.bouncycastle.asn1.ASN1EncodableVector;
 import org.bouncycastle.asn1.cms.AttributeTable;
 import org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
@@ -47,11 +47,11 @@ public final class SigningUtils {
     public static AS2SignedDataGenerator createSigningGenerator(
             AS2SignatureAlgorithm signingAlgorithm, Certificate[] 
certificateChain, PrivateKey privateKey)
             throws HttpException {
-        Args.notNull(certificateChain, "certificateChain");
+        ObjectHelper.notNull(certificateChain, "certificateChain");
         if (certificateChain.length == 0 || !(certificateChain[0] instanceof 
X509Certificate)) {
             throw new IllegalArgumentException("Invalid certificate chain");
         }
-        Args.notNull(privateKey, "privateKey");
+        ObjectHelper.notNull(privateKey, "privateKey");
 
         AS2SignedDataGenerator gen = new AS2SignedDataGenerator();
 
diff --git 
a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java
 
b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java
index 2894b676102..138338b7fe0 100644
--- 
a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java
+++ 
b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java
@@ -27,6 +27,7 @@ import java.security.SecureRandom;
 import java.security.Security;
 import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
+import java.time.Duration;
 import java.util.*;
 
 import com.helger.as2lib.client.AS2Client;
@@ -134,6 +135,10 @@ public class AS2MessageTest {
     private static final String METHOD = "POST";
     private static final String TARGET_HOST = "localhost";
     private static final int TARGET_PORT = 
AvailablePortFinder.getNextAvailable();
+    private static final Duration HTTP_SOCKET_TIMEOUT = Duration.ofSeconds(5);
+    private static final Duration HTTP_CONNECTION_TIMEOUT = 
Duration.ofSeconds(5);
+    private static final Integer HTTP_CONNECTION_POOL_SIZE = 5;
+    private static final Duration HTTP_CONNECTION_POOL_TTL = 
Duration.ofMinutes(15);
     private static final String RECIPIENT_DELIVERY_ADDRESS = 
"http://localhost:"; + TARGET_PORT + "/handle-receipts";
     private static final String AS2_VERSION = "1.1";
     private static final String USER_AGENT = "Camel AS2 Endpoint";
@@ -273,10 +278,7 @@ public class AS2MessageTest {
 
     @Test
     public void plainEDIMessageTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, 
REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME,
                 AS2MessageStructure.PLAIN, 
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, StandardCharsets.US_ASCII),
@@ -361,10 +363,7 @@ public class AS2MessageTest {
 
     @Test
     public void multipartSignedMessageTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, 
REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME,
                 AS2MessageStructure.SIGNED, 
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, StandardCharsets.US_ASCII),
@@ -515,10 +514,7 @@ public class AS2MessageTest {
     }
 
     public void envelopedMessageTest(AS2EncryptionAlgorithm 
encryptionAlgorithm) throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm());
 
@@ -573,10 +569,7 @@ public class AS2MessageTest {
     }
 
     public void envelopedAndSignedMessageTest(AS2EncryptionAlgorithm 
encryptionAlgorithm) throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm());
 
@@ -643,10 +636,7 @@ public class AS2MessageTest {
 
     @Test
     public void signatureVerificationTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, 
REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME,
                 AS2MessageStructure.SIGNED, 
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, StandardCharsets.US_ASCII),
@@ -673,10 +663,7 @@ public class AS2MessageTest {
 
     @Test
     public void mdnMessageTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, 
REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME,
                 AS2MessageStructure.PLAIN, 
ContentType.create(AS2MediaType.APPLICATION_EDIFACT, StandardCharsets.US_ASCII),
@@ -787,10 +774,7 @@ public class AS2MessageTest {
 
     @Test
     public void compressedMessageTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm());
 
@@ -840,10 +824,7 @@ public class AS2MessageTest {
 
     @Test
     public void compressedAndSignedMessageTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm());
 
@@ -909,10 +890,7 @@ public class AS2MessageTest {
 
     @Test
     public void envelopedAndCompressedMessageTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm());
 
@@ -971,10 +949,7 @@ public class AS2MessageTest {
 
     @Test
     public void envelopedCompressedAndSignedMessageTest() throws Exception {
-        AS2ClientConnection clientConnection = new AS2ClientConnection(
-                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
-                TARGET_HOST, TARGET_PORT);
-        AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
+        AS2ClientManager clientManager = createDefaultClientManager();
 
         LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm());
 
@@ -1088,4 +1063,11 @@ public class AS2MessageTest {
         assertEquals(EDI_MESSAGE, ediEntity.getEdiMessage().replaceAll("\r", 
""));
     }
 
+    private AS2ClientManager createDefaultClientManager() throws IOException {
+        AS2ClientConnection clientConnection = new AS2ClientConnection(
+                AS2_VERSION, USER_AGENT, CLIENT_FQDN,
+                TARGET_HOST, TARGET_PORT, HTTP_SOCKET_TIMEOUT, 
HTTP_CONNECTION_TIMEOUT, HTTP_CONNECTION_POOL_SIZE,
+                HTTP_CONNECTION_POOL_TTL);
+        return new AS2ClientManager(clientConnection);
+    }
 }
diff --git 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java
 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java
index f95e136124c..374bbfa4bef 100644
--- 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java
+++ 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java
@@ -37,6 +37,10 @@ public class AS2ClientManagerEndpointConfigurationConfigurer 
extends org.apache.
         map.put("EncryptingAlgorithm", 
org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class);
         map.put("EncryptingCertificateChain", 
java.security.cert.Certificate[].class);
         map.put("From", java.lang.String.class);
+        map.put("HttpConnectionPoolSize", java.lang.Integer.class);
+        map.put("HttpConnectionPoolTtl", java.time.Duration.class);
+        map.put("HttpConnectionTimeout", java.time.Duration.class);
+        map.put("HttpSocketTimeout", java.time.Duration.class);
         map.put("MdnMessageTemplate", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RequestUri", java.lang.String.class);
@@ -92,6 +96,14 @@ public class AS2ClientManagerEndpointConfigurationConfigurer 
extends org.apache.
         case "EncryptingCertificateChain": 
target.setEncryptingCertificateChain(property(camelContext, 
java.security.cert.Certificate[].class, value)); return true;
         case "from":
         case "From": target.setFrom(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": 
target.setHttpConnectionPoolSize(property(camelContext, 
java.lang.Integer.class, value)); return true;
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": 
target.setHttpConnectionPoolTtl(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": 
target.setHttpConnectionTimeout(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": 
target.setHttpSocketTimeout(property(camelContext, java.time.Duration.class, 
value)); return true;
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": 
target.setMdnMessageTemplate(property(camelContext, java.lang.String.class, 
value)); return true;
         case "methodname":
@@ -166,6 +178,14 @@ public class 
AS2ClientManagerEndpointConfigurationConfigurer extends org.apache.
         case "EncryptingCertificateChain": return 
java.security.cert.Certificate[].class;
         case "from":
         case "From": return java.lang.String.class;
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": return java.lang.Integer.class;
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": return java.time.Duration.class;
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": return java.time.Duration.class;
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": return java.time.Duration.class;
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": return java.lang.String.class;
         case "methodname":
@@ -236,6 +256,14 @@ public class 
AS2ClientManagerEndpointConfigurationConfigurer extends org.apache.
         case "EncryptingCertificateChain": return 
target.getEncryptingCertificateChain();
         case "from":
         case "From": return target.getFrom();
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": return 
target.getHttpConnectionPoolSize();
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": return target.getHttpConnectionPoolTtl();
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": return target.getHttpConnectionTimeout();
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": return target.getHttpSocketTimeout();
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": return target.getMdnMessageTemplate();
         case "methodname":
diff --git 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java
 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java
index 7c4f73d6131..46225f9739a 100644
--- 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java
+++ 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java
@@ -35,6 +35,10 @@ public class AS2ConfigurationConfigurer extends 
org.apache.camel.support.compone
         map.put("EncryptingAlgorithm", 
org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class);
         map.put("EncryptingCertificateChain", 
java.security.cert.Certificate[].class);
         map.put("From", java.lang.String.class);
+        map.put("HttpConnectionPoolSize", java.lang.Integer.class);
+        map.put("HttpConnectionPoolTtl", java.time.Duration.class);
+        map.put("HttpConnectionTimeout", java.time.Duration.class);
+        map.put("HttpSocketTimeout", java.time.Duration.class);
         map.put("MdnMessageTemplate", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RequestUri", java.lang.String.class);
@@ -86,6 +90,14 @@ public class AS2ConfigurationConfigurer extends 
org.apache.camel.support.compone
         case "EncryptingCertificateChain": 
target.setEncryptingCertificateChain(property(camelContext, 
java.security.cert.Certificate[].class, value)); return true;
         case "from":
         case "From": target.setFrom(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": 
target.setHttpConnectionPoolSize(property(camelContext, 
java.lang.Integer.class, value)); return true;
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": 
target.setHttpConnectionPoolTtl(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": 
target.setHttpConnectionTimeout(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": 
target.setHttpSocketTimeout(property(camelContext, java.time.Duration.class, 
value)); return true;
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": 
target.setMdnMessageTemplate(property(camelContext, java.lang.String.class, 
value)); return true;
         case "methodname":
@@ -156,6 +168,14 @@ public class AS2ConfigurationConfigurer extends 
org.apache.camel.support.compone
         case "EncryptingCertificateChain": return 
java.security.cert.Certificate[].class;
         case "from":
         case "From": return java.lang.String.class;
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": return java.lang.Integer.class;
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": return java.time.Duration.class;
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": return java.time.Duration.class;
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": return java.time.Duration.class;
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": return java.lang.String.class;
         case "methodname":
@@ -222,6 +242,14 @@ public class AS2ConfigurationConfigurer extends 
org.apache.camel.support.compone
         case "EncryptingCertificateChain": return 
target.getEncryptingCertificateChain();
         case "from":
         case "From": return target.getFrom();
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": return 
target.getHttpConnectionPoolSize();
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": return target.getHttpConnectionPoolTtl();
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": return target.getHttpConnectionTimeout();
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": return target.getHttpSocketTimeout();
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": return target.getMdnMessageTemplate();
         case "methodname":
diff --git 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java
 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java
index 7c4daf407fc..a6252b60c7c 100644
--- 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java
+++ 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java
@@ -36,6 +36,10 @@ public class AS2EndpointConfigurer extends 
PropertyConfigurerSupport implements
         map.put("encryptingAlgorithm", 
org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class);
         map.put("encryptingCertificateChain", 
java.security.cert.Certificate[].class);
         map.put("from", java.lang.String.class);
+        map.put("httpConnectionPoolSize", java.lang.Integer.class);
+        map.put("httpConnectionPoolTtl", java.time.Duration.class);
+        map.put("httpConnectionTimeout", java.time.Duration.class);
+        map.put("httpSocketTimeout", java.time.Duration.class);
         map.put("inBody", java.lang.String.class);
         map.put("mdnMessageTemplate", java.lang.String.class);
         map.put("requestUri", java.lang.String.class);
@@ -91,6 +95,14 @@ public class AS2EndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": 
target.setExchangePattern(property(camelContext, 
org.apache.camel.ExchangePattern.class, value)); return true;
         case "from": target.getConfiguration().setFrom(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "httpconnectionpoolsize":
+        case "httpConnectionPoolSize": 
target.getConfiguration().setHttpConnectionPoolSize(property(camelContext, 
java.lang.Integer.class, value)); return true;
+        case "httpconnectionpoolttl":
+        case "httpConnectionPoolTtl": 
target.getConfiguration().setHttpConnectionPoolTtl(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpconnectiontimeout":
+        case "httpConnectionTimeout": 
target.getConfiguration().setHttpConnectionTimeout(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpsockettimeout":
+        case "httpSocketTimeout": 
target.getConfiguration().setHttpSocketTimeout(property(camelContext, 
java.time.Duration.class, value)); return true;
         case "inbody":
         case "inBody": target.setInBody(property(camelContext, 
java.lang.String.class, value)); return true;
         case "lazystartproducer":
@@ -162,6 +174,14 @@ public class AS2EndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return org.apache.camel.ExchangePattern.class;
         case "from": return java.lang.String.class;
+        case "httpconnectionpoolsize":
+        case "httpConnectionPoolSize": return java.lang.Integer.class;
+        case "httpconnectionpoolttl":
+        case "httpConnectionPoolTtl": return java.time.Duration.class;
+        case "httpconnectiontimeout":
+        case "httpConnectionTimeout": return java.time.Duration.class;
+        case "httpsockettimeout":
+        case "httpSocketTimeout": return java.time.Duration.class;
         case "inbody":
         case "inBody": return java.lang.String.class;
         case "lazystartproducer":
@@ -229,6 +249,14 @@ public class AS2EndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return target.getExchangePattern();
         case "from": return target.getConfiguration().getFrom();
+        case "httpconnectionpoolsize":
+        case "httpConnectionPoolSize": return 
target.getConfiguration().getHttpConnectionPoolSize();
+        case "httpconnectionpoolttl":
+        case "httpConnectionPoolTtl": return 
target.getConfiguration().getHttpConnectionPoolTtl();
+        case "httpconnectiontimeout":
+        case "httpConnectionTimeout": return 
target.getConfiguration().getHttpConnectionTimeout();
+        case "httpsockettimeout":
+        case "httpSocketTimeout": return 
target.getConfiguration().getHttpSocketTimeout();
         case "inbody":
         case "inBody": return target.getInBody();
         case "lazystartproducer":
diff --git 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java
 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java
index 35a22108917..3d138d2b9d8 100644
--- 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java
+++ 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java
@@ -21,7 +21,7 @@ public class AS2EndpointUriFactory extends 
org.apache.camel.support.component.En
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(36);
+        Set<String> props = new HashSet<>(40);
         props.add("apiName");
         props.add("as2From");
         props.add("as2MessageStructure");
@@ -41,6 +41,10 @@ public class AS2EndpointUriFactory extends 
org.apache.camel.support.component.En
         props.add("exceptionHandler");
         props.add("exchangePattern");
         props.add("from");
+        props.add("httpConnectionPoolSize");
+        props.add("httpConnectionPoolTtl");
+        props.add("httpConnectionTimeout");
+        props.add("httpSocketTimeout");
         props.add("inBody");
         props.add("lazyStartProducer");
         props.add("mdnMessageTemplate");
diff --git 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java
 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java
index 2d29733a06b..7952b980868 100644
--- 
a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java
+++ 
b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java
@@ -35,6 +35,10 @@ public class AS2ServerManagerEndpointConfigurationConfigurer 
extends org.apache.
         map.put("EncryptingAlgorithm", 
org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class);
         map.put("EncryptingCertificateChain", 
java.security.cert.Certificate[].class);
         map.put("From", java.lang.String.class);
+        map.put("HttpConnectionPoolSize", java.lang.Integer.class);
+        map.put("HttpConnectionPoolTtl", java.time.Duration.class);
+        map.put("HttpConnectionTimeout", java.time.Duration.class);
+        map.put("HttpSocketTimeout", java.time.Duration.class);
         map.put("MdnMessageTemplate", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RequestUri", java.lang.String.class);
@@ -87,6 +91,14 @@ public class AS2ServerManagerEndpointConfigurationConfigurer 
extends org.apache.
         case "EncryptingCertificateChain": 
target.setEncryptingCertificateChain(property(camelContext, 
java.security.cert.Certificate[].class, value)); return true;
         case "from":
         case "From": target.setFrom(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": 
target.setHttpConnectionPoolSize(property(camelContext, 
java.lang.Integer.class, value)); return true;
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": 
target.setHttpConnectionPoolTtl(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": 
target.setHttpConnectionTimeout(property(camelContext, 
java.time.Duration.class, value)); return true;
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": 
target.setHttpSocketTimeout(property(camelContext, java.time.Duration.class, 
value)); return true;
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": 
target.setMdnMessageTemplate(property(camelContext, java.lang.String.class, 
value)); return true;
         case "methodname":
@@ -159,6 +171,14 @@ public class 
AS2ServerManagerEndpointConfigurationConfigurer extends org.apache.
         case "EncryptingCertificateChain": return 
java.security.cert.Certificate[].class;
         case "from":
         case "From": return java.lang.String.class;
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": return java.lang.Integer.class;
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": return java.time.Duration.class;
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": return java.time.Duration.class;
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": return java.time.Duration.class;
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": return java.lang.String.class;
         case "methodname":
@@ -227,6 +247,14 @@ public class 
AS2ServerManagerEndpointConfigurationConfigurer extends org.apache.
         case "EncryptingCertificateChain": return 
target.getEncryptingCertificateChain();
         case "from":
         case "From": return target.getFrom();
+        case "httpconnectionpoolsize":
+        case "HttpConnectionPoolSize": return 
target.getHttpConnectionPoolSize();
+        case "httpconnectionpoolttl":
+        case "HttpConnectionPoolTtl": return target.getHttpConnectionPoolTtl();
+        case "httpconnectiontimeout":
+        case "HttpConnectionTimeout": return target.getHttpConnectionTimeout();
+        case "httpsockettimeout":
+        case "HttpSocketTimeout": return target.getHttpSocketTimeout();
         case "mdnmessagetemplate":
         case "MdnMessageTemplate": return target.getMdnMessageTemplate();
         case "methodname":
diff --git 
a/components/camel-as2/camel-as2-component/src/generated/resources/org/apache/camel/component/as2/as2.json
 
b/components/camel-as2/camel-as2-component/src/generated/resources/org/apache/camel/component/as2/as2.json
index a6f9c8fe0d8..d0288b227c8 100644
--- 
a/components/camel-as2/camel-as2-component/src/generated/resources/org/apache/camel/component/as2/as2.json
+++ 
b/components/camel-as2/camel-as2-component/src/generated/resources/org/apache/camel/component/as2/as2.json
@@ -46,6 +46,10 @@
     "encryptingAlgorithm": { "kind": "parameter", "displayName": "Encrypting 
Algorithm", "group": "common", "label": "", "required": false, "type": 
"object", "javaType": 
"org.apache.camel.component.as2.api.AS2EncryptionAlgorithm", "enum": [ 
"AES128_CBC", "AES192_CBC", "AES256_CBC", "AES128_CCM", "AES192_CCM", 
"AES256_CCM", "AES128_GCM", "AES192_GCM", "AES256_GCM", "CAMELLIA128_CBC", 
"CAMELLIA192_CBC", "CAMELLIA256_CBC", "CAST5_CBC", "DES_CBC", "DES_EDE3_CBC", 
"GOST28147_GCFB", "IDEA_CBC" [...]
     "encryptingCertificateChain": { "kind": "parameter", "displayName": 
"Encrypting Certificate Chain", "group": "common", "label": "", "required": 
false, "type": "object", "javaType": "java.security.cert.Certificate[]", 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.as2.AS2Configuration", "configurationField": 
"configuration", "description": "The chain of certificates used to encrypt EDI 
message." },
     "from": { "kind": "parameter", "displayName": "From", "group": "common", 
"label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.as2.AS2Configuration", 
"configurationField": "configuration", "description": "The value of the From 
header of AS2 message." },
+    "httpConnectionPoolSize": { "kind": "parameter", "displayName": "Http 
Connection Pool Size", "group": "common", "label": "", "required": false, 
"type": "integer", "javaType": "java.lang.Integer", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "5", "configurationClass": 
"org.apache.camel.component.as2.AS2Configuration", "configurationField": 
"configuration", "description": "The maximum size of the connection pool for 
http connections (client only)" },
+    "httpConnectionPoolTtl": { "kind": "parameter", "displayName": "Http 
Connection Pool Ttl", "group": "common", "label": "", "required": false, 
"type": "object", "javaType": "java.time.Duration", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "15m", 
"configurationClass": "org.apache.camel.component.as2.AS2Configuration", 
"configurationField": "configuration", "description": "The time to live for 
connections in the connection pool (client only)" },
+    "httpConnectionTimeout": { "kind": "parameter", "displayName": "Http 
Connection Timeout", "group": "common", "label": "", "required": false, "type": 
"object", "javaType": "java.time.Duration", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "5s", "configurationClass": 
"org.apache.camel.component.as2.AS2Configuration", "configurationField": 
"configuration", "description": "The timeout of the http connection (client 
only)" },
+    "httpSocketTimeout": { "kind": "parameter", "displayName": "Http Socket 
Timeout", "group": "common", "label": "", "required": false, "type": "object", 
"javaType": "java.time.Duration", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "5s", "configurationClass": 
"org.apache.camel.component.as2.AS2Configuration", "configurationField": 
"configuration", "description": "The timeout of the underlying http socket 
(client only)" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": 
"common", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Sets the name of a parameter to be passed in the exchange In 
Body" },
     "mdnMessageTemplate": { "kind": "parameter", "displayName": "Mdn Message 
Template", "group": "common", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.as2.AS2Configuration", "configurationField": 
"configuration", "description": "The template used to format MDN message" },
     "requestUri": { "kind": "parameter", "displayName": "Request Uri", 
"group": "common", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "\/", "configurationClass": 
"org.apache.camel.component.as2.AS2Configuration", "configurationField": 
"configuration", "description": "The request URI of EDI message." },
diff --git 
a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java
 
b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java
index 469c7553129..67616c10655 100644
--- 
a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java
+++ 
b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.as2;
 
 import java.security.PrivateKey;
 import java.security.cert.Certificate;
+import java.time.Duration;
 
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.as2.api.AS2CompressionAlgorithm;
@@ -99,6 +100,14 @@ public class AS2Configuration {
     private String mdnMessageTemplate;
     @UriParam
     private String attachedFileName;
+    @UriParam(defaultValue = "5s")
+    private Duration httpSocketTimeout = Duration.ofSeconds(5);
+    @UriParam(defaultValue = "5s")
+    private Duration httpConnectionTimeout = Duration.ofSeconds(5);
+    @UriParam(defaultValue = "5")
+    private Integer httpConnectionPoolSize = 5;
+    @UriParam(defaultValue = "15m")
+    private Duration httpConnectionPoolTtl = Duration.ofMinutes(15);
 
     public AS2ApiName getApiName() {
         return apiName;
@@ -436,4 +445,49 @@ public class AS2Configuration {
     public void setAttachedFileName(String attachedFileName) {
         this.attachedFileName = attachedFileName;
     }
+
+    public Duration getHttpSocketTimeout() {
+        return httpSocketTimeout;
+    }
+
+    /**
+     * The timeout of the underlying http socket (client only)
+     */
+    public void setHttpSocketTimeout(Duration httpSocketTimeout) {
+        this.httpSocketTimeout = httpSocketTimeout;
+    }
+
+    public Duration getHttpConnectionTimeout() {
+        return httpConnectionTimeout;
+    }
+
+    /**
+     * The timeout of the http connection (client only)
+     */
+    public void setHttpConnectionTimeout(Duration httpConnectionTimeout) {
+        this.httpConnectionTimeout = httpConnectionTimeout;
+    }
+
+    public Integer getHttpConnectionPoolSize() {
+        return httpConnectionPoolSize;
+    }
+
+    /**
+     * The maximum size of the connection pool for http connections (client 
only)
+     */
+    public void setHttpConnectionPoolSize(Integer httpConnectionPoolSize) {
+        this.httpConnectionPoolSize = httpConnectionPoolSize;
+    }
+
+    public Duration getHttpConnectionPoolTtl() {
+        return httpConnectionPoolTtl;
+    }
+
+    /**
+     * The time to live for connections in the connection pool (client only)
+     */
+    public void setHttpConnectionPoolTtl(Duration httpConnectionPoolTtl) {
+        this.httpConnectionPoolTtl = httpConnectionPoolTtl;
+    }
+
 }
diff --git 
a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Producer.java
 
b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Producer.java
index 5d2ef8c35e3..fece60f4614 100644
--- 
a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Producer.java
+++ 
b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Producer.java
@@ -43,9 +43,9 @@ public class AS2Producer extends 
AbstractApiProducer<AS2ApiName, AS2Configuratio
         HttpResponse response = context.getResponse();
         HttpEntity entity = response.getEntity();
         if (entity instanceof DispositionNotificationMultipartReportEntity || 
entity instanceof MultipartSignedEntity) {
-            resultExchange.getOut().setBody(entity);
+            resultExchange.getMessage().setBody(entity);
         } else {
-            resultExchange.getOut().setBody(null);
+            resultExchange.getMessage().setBody(null);
         }
     }
 }
diff --git 
a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java
 
b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java
index 20d661f897c..13f5146ef18 100644
--- 
a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java
+++ 
b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java
@@ -53,7 +53,9 @@ public final class AS2ConnectionHelper {
     public static AS2ClientConnection 
createAS2ClientConnection(AS2Configuration configuration) throws IOException {
         return new AS2ClientConnection(
                 configuration.getAs2Version(), configuration.getUserAgent(), 
configuration.getClientFqdn(),
-                configuration.getTargetHostname(), 
configuration.getTargetPortNumber());
+                configuration.getTargetHostname(), 
configuration.getTargetPortNumber(), configuration.getHttpSocketTimeout(),
+                configuration.getHttpConnectionTimeout(), 
configuration.getHttpConnectionPoolSize(),
+                configuration.getHttpConnectionPoolTtl());
     }
 
     /**
diff --git 
a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java
 
b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java
index 7449fe0a66f..a485f2927b9 100644
--- 
a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java
+++ 
b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java
@@ -23,6 +23,7 @@ import java.security.SecureRandom;
 import java.security.Security;
 import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -93,6 +94,10 @@ public class AS2ServerManagerIT extends AbstractAS2ITSupport 
{
     private static final String METHOD = "POST";
     private static final String TARGET_HOST = "localhost";
     private static final int TARGET_PORT = 8888;
+    private static final Duration HTTP_SOCKET_TIMEOUT = Duration.ofSeconds(5);
+    private static final Duration HTTP_CONNECTION_TIMEOUT = 
Duration.ofSeconds(5);
+    private static final Integer HTTP_CONNECTION_POOL_SIZE = 5;
+    private static final Duration HTTP_CONNECTION_POOL_TTL = 
Duration.ofMinutes(15);
     private static final String AS2_VERSION = "1.1";
     private static final String USER_AGENT = "Camel AS2 Endpoint";
     private static final String REQUEST_URI = "/";
@@ -149,7 +154,9 @@ public class AS2ServerManagerIT extends 
AbstractAS2ITSupport {
     @Test
     public void receivePlainEDIMessageTest() throws Exception {
         AS2ClientConnection clientConnection
-                = new AS2ClientConnection(AS2_VERSION, USER_AGENT, 
CLIENT_FQDN, TARGET_HOST, TARGET_PORT);
+                = new AS2ClientConnection(
+                        AS2_VERSION, USER_AGENT, CLIENT_FQDN, TARGET_HOST, 
TARGET_PORT, HTTP_SOCKET_TIMEOUT,
+                        HTTP_CONNECTION_TIMEOUT, HTTP_CONNECTION_POOL_SIZE, 
HTTP_CONNECTION_POOL_TTL);
         AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
 
         clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, 
AS2_NAME, AS2MessageStructure.PLAIN,
@@ -212,7 +219,9 @@ public class AS2ServerManagerIT extends 
AbstractAS2ITSupport {
     public void receiveMultipartSignedMessageTest() throws Exception {
 
         AS2ClientConnection clientConnection
-                = new AS2ClientConnection(AS2_VERSION, USER_AGENT, 
CLIENT_FQDN, TARGET_HOST, TARGET_PORT);
+                = new AS2ClientConnection(
+                        AS2_VERSION, USER_AGENT, CLIENT_FQDN, TARGET_HOST, 
TARGET_PORT, HTTP_SOCKET_TIMEOUT,
+                        HTTP_CONNECTION_TIMEOUT, HTTP_CONNECTION_POOL_SIZE, 
HTTP_CONNECTION_POOL_TTL);
         AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
 
         clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, 
AS2_NAME, AS2MessageStructure.SIGNED,
@@ -290,7 +299,9 @@ public class AS2ServerManagerIT extends 
AbstractAS2ITSupport {
     @Test
     public void receiveEnvelopedMessageTest() throws Exception {
         AS2ClientConnection clientConnection
-                = new AS2ClientConnection(AS2_VERSION, USER_AGENT, 
CLIENT_FQDN, TARGET_HOST, TARGET_PORT);
+                = new AS2ClientConnection(
+                        AS2_VERSION, USER_AGENT, CLIENT_FQDN, TARGET_HOST, 
TARGET_PORT, HTTP_SOCKET_TIMEOUT,
+                        HTTP_CONNECTION_TIMEOUT, HTTP_CONNECTION_POOL_SIZE, 
HTTP_CONNECTION_POOL_TTL);
         AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
 
         clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, 
AS2_NAME, AS2MessageStructure.ENCRYPTED,
@@ -358,7 +369,9 @@ public class AS2ServerManagerIT extends 
AbstractAS2ITSupport {
     @Test
     public void sendEditMessageToFailingProcessorTest() throws Exception {
         AS2ClientConnection clientConnection
-                = new AS2ClientConnection(AS2_VERSION, USER_AGENT, 
CLIENT_FQDN, TARGET_HOST, TARGET_PORT);
+                = new AS2ClientConnection(
+                        AS2_VERSION, USER_AGENT, CLIENT_FQDN, TARGET_HOST, 
TARGET_PORT, HTTP_SOCKET_TIMEOUT,
+                        HTTP_CONNECTION_TIMEOUT, HTTP_CONNECTION_POOL_SIZE, 
HTTP_CONNECTION_POOL_TTL);
         AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
 
         HttpCoreContext context = clientManager.send(EDI_MESSAGE, 
"/process_error", SUBJECT, FROM, AS2_NAME, AS2_NAME,
@@ -382,7 +395,9 @@ public class AS2ServerManagerIT extends 
AbstractAS2ITSupport {
     @Test
     public void checkMDNTest() throws Exception {
         AS2ClientConnection clientConnection
-                = new AS2ClientConnection(AS2_VERSION, USER_AGENT, 
CLIENT_FQDN, TARGET_HOST, TARGET_PORT);
+                = new AS2ClientConnection(
+                        AS2_VERSION, USER_AGENT, CLIENT_FQDN, TARGET_HOST, 
TARGET_PORT, HTTP_SOCKET_TIMEOUT,
+                        HTTP_CONNECTION_TIMEOUT, HTTP_CONNECTION_POOL_SIZE, 
HTTP_CONNECTION_POOL_TTL);
         AS2ClientManager clientManager = new 
AS2ClientManager(clientConnection);
         
         //Testing MDN parameter defaults

Reply via email to