This is an automated email from the ASF dual-hosted git repository.
michaelpearce pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-nms-amqp.git
The following commit(s) were added to refs/heads/master by this push:
new 53794ff AMQNET-616: Add TCP Keep-Alive support
new 9e9f1b4 Merge pull request #38 from Havret/add_tcp_keep_alive_support
53794ff is described below
commit 53794ffd3af0091d1e7664a30bd9432d1b0ae8c9
Author: Havret <[email protected]>
AuthorDate: Tue Sep 24 23:00:25 2019 +0200
AMQNET-616: Add TCP Keep-Alive support
---
docs/configuration.md | 4 ++
src/NMS.AMQP/Transport/ISecureTransportContext.cs | 3 --
src/NMS.AMQP/Transport/ITransportContext.cs | 12 ++++-
src/NMS.AMQP/Transport/SecureTransportContext.cs | 63 +---------------------
src/NMS.AMQP/Transport/TransportContext.cs | 51 +++++-------------
.../Transport/TransportContextFactoryTest.cs | 6 +++
6 files changed, 36 insertions(+), 103 deletions(-)
diff --git a/docs/configuration.md b/docs/configuration.md
index 1c4d1e0..2b3046e 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -37,8 +37,12 @@ The complete set of TCP Transport options is listed below:
- **transport.receiveBufferSize** Specifies the SendBufferSize option of the
TCP socket.
- **transport.receiveTimeout** Specifies the ReceiveTimeout option of the TCP
socket.
- **transport.sendTimeout** Specifies the SendTimeout option of the TCP socket.
+- **transport.tcpKeepAliveTime** Specifies how often a keep-alive transmission
is sent to an idle connection.
+- **transport.tcpKeepAliveInterval** Specifies how often a keep-alive
transmission is sent when no response is received from previous keep-alive
transmissions.
- **transport.tcpNoDelay** Specifies the NoDelay option of the TCP socket.
+If *tcpKeepAliveTime* or *tcpKeepAliveInterval* it set, TCP Keep-Alive is
enabled.
+
### Failover Configuration options
With failover enabled the client can reconnect to another server automatically
when connection to the current server is lost for some reason. The failover URI
is always initiated with the failover prefix and a list of URIs for the
server(s) is contained inside a set of parentheses. The "nms." options are
applied to the overall failover URI, outside the parentheses, and affect the
NMS Connection object for its lifetime.
diff --git a/src/NMS.AMQP/Transport/ISecureTransportContext.cs
b/src/NMS.AMQP/Transport/ISecureTransportContext.cs
index 4cac12e..97762dd 100644
--- a/src/NMS.AMQP/Transport/ISecureTransportContext.cs
+++ b/src/NMS.AMQP/Transport/ISecureTransportContext.cs
@@ -21,9 +21,6 @@ namespace Apache.NMS.AMQP.Transport
{
public interface ISecureTransportContext : ITransportContext
{
-
- new ISecureTransportContext Copy();
-
string ServerName { get; set; }
string ClientCertFileName { get; set; }
diff --git a/src/NMS.AMQP/Transport/ITransportContext.cs
b/src/NMS.AMQP/Transport/ITransportContext.cs
index a7afefb..05eec6e 100644
--- a/src/NMS.AMQP/Transport/ITransportContext.cs
+++ b/src/NMS.AMQP/Transport/ITransportContext.cs
@@ -33,10 +33,18 @@ namespace Apache.NMS.AMQP.Transport
int SendTimeout { get; set; }
bool TcpNoDelay { get; set; }
+
+ /// <summary>
+ /// Gets or sets how often a keep-alive transmission is sent to an
idle connection.
+ /// </summary>
+ uint TcpKeepAliveTime { get; set; }
- bool IsSecure { get; }
+ /// <summary>
+ /// Gets or sets How often a keep-alive transmission is sent when no
response is received from previous keep-alive transmissions.
+ /// </summary>
+ uint TcpKeepAliveInterval { get; set; }
- ITransportContext Copy();
+ bool IsSecure { get; }
Task<Connection> CreateAsync(Address address, IHandler handler);
}
diff --git a/src/NMS.AMQP/Transport/SecureTransportContext.cs
b/src/NMS.AMQP/Transport/SecureTransportContext.cs
index cc3913c..08cfc66 100644
--- a/src/NMS.AMQP/Transport/SecureTransportContext.cs
+++ b/src/NMS.AMQP/Transport/SecureTransportContext.cs
@@ -37,8 +37,8 @@ namespace Apache.NMS.AMQP.Transport
internal class SecureTransportContext : TransportContext,
ISecureTransportContext
{
- private readonly static List<string> SupportedProtocols;
- private readonly static Dictionary<string, int>
SupportedProtocolValues;
+ private static readonly List<string> SupportedProtocols;
+ private static readonly Dictionary<string, int>
SupportedProtocolValues;
#region static Initializer
@@ -411,65 +411,6 @@ namespace Apache.NMS.AMQP.Transport
}
#endregion
-
- #region Copy Methods
-
-
- protected override void CopyBuilder(Amqp.ConnectionFactory copy)
- {
- base.CopyBuilder(copy);
-
- copy.SSL.Protocols = connectionBuilder.SSL.Protocols;
- copy.SSL.CheckCertificateRevocation =
connectionBuilder.SSL.CheckCertificateRevocation;
-
- if (connectionBuilder.SSL.ClientCertificates != null)
- {
- copy.SSL.ClientCertificates = new
X509CertificateCollection(connectionBuilder.SSL.ClientCertificates);
- }
-
- }
-
- protected override void CopyInto(TransportContext copy)
- {
- SecureTransportContext stcCopy = copy as SecureTransportContext;
-
- // Copy Secure properties.
-
- // copy keystore properties
- stcCopy.KeyStoreName = this.KeyStoreName;
- stcCopy.KeyStorePassword = this.KeyStorePassword;
- stcCopy.KeyStoreLocation = this.KeyStoreLocation;
-
- // copy certificate properties
- stcCopy.AcceptInvalidBrokerCert = this.AcceptInvalidBrokerCert;
- stcCopy.ServerName = this.ServerName;
- stcCopy.ClientCertFileName = this.ClientCertFileName;
- stcCopy.ClientCertPassword = this.ClientCertPassword;
- stcCopy.ClientCertSubject = this.ClientCertSubject;
-
- // copy application callback
- stcCopy.ServerCertificateValidateCallback =
this.ServerCertificateValidateCallback;
- stcCopy.ClientCertificateSelectCallback =
this.ClientCertificateSelectCallback;
-
- base.CopyInto(copy);
-
- stcCopy.connectionBuilder.SSL.RemoteCertificateValidationCallback
= this.ContextServerCertificateValidation;
- stcCopy.connectionBuilder.SSL.LocalCertificateSelectionCallback =
this.ContextLocalCertificateSelect;
- }
-
- public override ITransportContext Copy()
- {
- TransportContext copy = new SecureTransportContext();
- this.CopyInto(copy);
- return copy;
- }
-
- ISecureTransportContext ISecureTransportContext.Copy()
- {
- return this.Copy() as SecureTransportContext;
- }
-
- #endregion
}
}
diff --git a/src/NMS.AMQP/Transport/TransportContext.cs
b/src/NMS.AMQP/Transport/TransportContext.cs
index d5aead9..e62c9ac 100644
--- a/src/NMS.AMQP/Transport/TransportContext.cs
+++ b/src/NMS.AMQP/Transport/TransportContext.cs
@@ -26,9 +26,6 @@ using Apache.NMS.AMQP.Util;
namespace Apache.NMS.AMQP.Transport
{
-
- #region Transport Context
-
/// <summary>
/// Transport management is mainly handled by the AmqpNetLite library,
Except for custom transports.
/// TransportContext should configure the Amqp.ConnectionFactory for the
tcp transport properties.
@@ -43,15 +40,25 @@ namespace Apache.NMS.AMQP.Transport
connectionBuilder.SASL.Profile = Amqp.Sasl.SaslProfile.Anonymous;
}
- #region Transport Options
-
public int ReceiveBufferSize { get =>
this.connectionBuilder.TCP.ReceiveBufferSize; set =>
this.connectionBuilder.TCP.ReceiveBufferSize = value; }
public int ReceiveTimeout { get =>
this.connectionBuilder.TCP.ReceiveTimeout; set =>
this.connectionBuilder.TCP.ReceiveTimeout = value; }
public int SendBufferSize { get =>
this.connectionBuilder.TCP.SendBufferSize; set =>
this.connectionBuilder.TCP.SendBufferSize = value; }
public int SendTimeout { get =>
this.connectionBuilder.TCP.SendTimeout; set =>
this.connectionBuilder.TCP.SendTimeout = value; }
public bool TcpNoDelay { get => this.connectionBuilder.TCP.NoDelay;
set => this.connectionBuilder.TCP.NoDelay = value; }
- public uint TcpKeepAliveTime { get =>
this.connectionBuilder.TCP.KeepAlive.KeepAliveTime; set =>
this.connectionBuilder.TCP.KeepAlive.KeepAliveTime = value; }
- public uint TcpKeepAliveInterval { get =>
this.connectionBuilder.TCP.KeepAlive.KeepAliveInterval; set =>
this.connectionBuilder.TCP.KeepAlive.KeepAliveInterval = value; }
+
+ public uint TcpKeepAliveTime
+ {
+ get => this.connectionBuilder.TCP.KeepAlive?.KeepAliveTime ??
default;
+ set => this.TcpKeepAliveSettings.KeepAliveTime = value;
+ }
+
+ public uint TcpKeepAliveInterval
+ {
+ get => this.connectionBuilder.TCP.KeepAlive?.KeepAliveInterval ??
default;
+ set => this.TcpKeepAliveSettings.KeepAliveInterval = value;
+ }
+
+ private TcpKeepAliveSettings TcpKeepAliveSettings =>
this.connectionBuilder.TCP.KeepAlive ?? (this.connectionBuilder.TCP.KeepAlive =
new TcpKeepAliveSettings());
public bool SocketLingerEnabled
{
@@ -84,42 +91,12 @@ namespace Apache.NMS.AMQP.Transport
}
}
}
-
- #endregion
public virtual bool IsSecure { get; } = false;
- public virtual ITransportContext Copy()
- {
- TransportContext copy = new TransportContext();
- this.CopyInto(copy);
- return copy;
- }
-
public virtual Task<Connection> CreateAsync(Address address, IHandler
handler)
{
return connectionBuilder.CreateAsync(address, handler);
}
-
- protected virtual void CopyInto(TransportContext copy)
- {
- //copy.factory = this.factory;
- //copy.UseLogging = this.UseLogging;
- //Amqp.ConnectionFactory builder = new Amqp.ConnectionFactory();
- //this.CopyBuilder(builder);
- //copy.connectionBuilder = builder;
- }
-
- protected virtual void CopyBuilder(Amqp.ConnectionFactory copy)
- {
- StringDictionary amqpProperties =
PropertyUtil.GetProperties(this.connectionBuilder.AMQP);
- StringDictionary tcpProperties =
PropertyUtil.GetProperties(this.connectionBuilder.TCP);
- PropertyUtil.SetProperties(copy.AMQP, amqpProperties);
- PropertyUtil.SetProperties(copy.TCP, tcpProperties);
- copy.SASL.Profile = this.connectionBuilder.SASL.Profile;
- }
}
-
- #endregion
-
}
diff --git a/test/Apache-NMS-AMQP-Test/Transport/TransportContextFactoryTest.cs
b/test/Apache-NMS-AMQP-Test/Transport/TransportContextFactoryTest.cs
index 8669370..5e69210 100644
--- a/test/Apache-NMS-AMQP-Test/Transport/TransportContextFactoryTest.cs
+++ b/test/Apache-NMS-AMQP-Test/Transport/TransportContextFactoryTest.cs
@@ -29,6 +29,8 @@ namespace NMS.AMQP.Test.Transport
private int customReceiveTimeout = 1000;
private int customSendBufferSize = 32 * 1024;
private int customSendTimeout = 2000;
+ private int customTcpKeepAliveTime = 2500;
+ private int customTcpKeepAliveInterval = 3000;
[Test]
public void TestCreateWithDefaultOptions()
@@ -54,6 +56,8 @@ namespace NMS.AMQP.Test.Transport
"transport.receiveTimeout=" +
customReceiveTimeout + "&" +
"transport.sendBufferSize=" +
customSendBufferSize + "&" +
"transport.sendTimeout=" + customSendTimeout +
"&" +
+ "transport.tcpKeepAliveTime=" +
customTcpKeepAliveTime + "&" +
+ "transport.tcpKeepAliveInterval=" +
customTcpKeepAliveInterval + "&" +
"transport.tcpNoDelay=" + customTcpNoDelay);
ITransportContext transportContext =
TransportContextFactory.CreateTransportContext(uri);
@@ -64,6 +68,8 @@ namespace NMS.AMQP.Test.Transport
Assert.AreEqual(customReceiveTimeout,
transportContext.ReceiveTimeout);
Assert.AreEqual(customSendBufferSize,
transportContext.SendBufferSize);
Assert.AreEqual(customSendTimeout, transportContext.SendTimeout);
+ Assert.AreEqual(customTcpKeepAliveTime,
transportContext.TcpKeepAliveTime);
+ Assert.AreEqual(customTcpKeepAliveInterval,
transportContext.TcpKeepAliveInterval);
Assert.AreEqual(customTcpNoDelay, transportContext.TcpNoDelay);
}