Skip to content

Commit 4543259

Browse files
committed
Expose TCP keep alive settings
1 parent 04ee2e4 commit 4543259

4 files changed

Lines changed: 49 additions & 5 deletions

File tree

src/ArtemisNetClient/AutoRecovering/AutoRecoveringConnection.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ internal class AutoRecoveringConnection : IConnection
2323
private readonly Func<IMessageIdPolicy> _messageIdPolicyFactory;
2424
private readonly Func<string> _clientIdFactory;
2525
private readonly SslSettings _sslSettings;
26+
private readonly TcpSettings _tcpSettings;
2627
private readonly ILogger<AutoRecoveringConnection> _logger;
2728
private readonly Endpoint[] _endpoints;
2829
private readonly ChannelReader<ConnectCommand> _reader;
@@ -37,13 +38,15 @@ public AutoRecoveringConnection(ILoggerFactory loggerFactory,
3738
IRecoveryPolicy recoveryPolicy,
3839
Func<IMessageIdPolicy> messageIdPolicyFactory,
3940
Func<string> clientIdFactory,
40-
SslSettings sslSettings)
41+
SslSettings sslSettings,
42+
TcpSettings tcpSettings)
4143
{
4244
_logger = loggerFactory.CreateLogger<AutoRecoveringConnection>();
4345
_loggerFactory = loggerFactory;
4446
_messageIdPolicyFactory = messageIdPolicyFactory;
4547
_clientIdFactory = clientIdFactory;
4648
_sslSettings = sslSettings;
49+
_tcpSettings = tcpSettings;
4750
_endpoints = endpoints.ToArray();
4851

4952
var channel = Channel.CreateUnbounded<ConnectCommand>();
@@ -178,7 +181,7 @@ private Task<IConnection> CreateConnection(CancellationToken cancellationToken)
178181
int retryCount = context.GetRetryCount();
179182
var endpoint = GetNextEndpoint(retryCount);
180183
context.SetEndpoint(endpoint);
181-
var connectionBuilder = new ConnectionBuilder(_loggerFactory, _messageIdPolicyFactory, _clientIdFactory, _sslSettings);
184+
var connectionBuilder = new ConnectionBuilder(_loggerFactory, _messageIdPolicyFactory, _clientIdFactory, _sslSettings, _tcpSettings);
182185
var connection = await connectionBuilder.CreateAsync(endpoint, ct).ConfigureAwait(false);
183186

184187
if (retryCount > 0)

src/ArtemisNetClient/Builders/ConnectionBuilder.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,20 @@ internal class ConnectionBuilder
1818
private readonly Func<IMessageIdPolicy> _messageIdPolicyFactory;
1919
private readonly Func<string> _clientIdFactory;
2020
private readonly SslSettings _sslSettings;
21+
private readonly TcpSettings _tcpSettings;
2122
private readonly TaskCompletionSource<bool> _tcs;
2223

2324
public ConnectionBuilder(ILoggerFactory loggerFactory,
2425
Func<IMessageIdPolicy> messageIdPolicyFactory,
2526
Func<string> clientIdFactory,
26-
SslSettings sslSettings)
27+
SslSettings sslSettings,
28+
TcpSettings tcpSettings)
2729
{
2830
_loggerFactory = loggerFactory;
2931
_messageIdPolicyFactory = messageIdPolicyFactory;
3032
_clientIdFactory = clientIdFactory;
3133
_sslSettings = sslSettings;
34+
_tcpSettings = tcpSettings;
3235
_tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
3336
}
3437

@@ -51,6 +54,12 @@ public async Task<IConnection> CreateAsync(Endpoint endpoint, CancellationToken
5154
connectionFactory.SSL.LocalCertificateSelectionCallback = _sslSettings.LocalCertificateSelectionCallback;
5255
}
5356

57+
if (_tcpSettings != null)
58+
{
59+
connectionFactory.TCP.KeepAlive.KeepAliveTime = _tcpSettings.KeepAliveTime;
60+
connectionFactory.TCP.KeepAlive.KeepAliveInterval = _tcpSettings.KeepAliveInterval;
61+
}
62+
5463
try
5564
{
5665
var open = GetOpenFrame(endpoint);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace ActiveMQ.Artemis.Client;
2+
3+
/// <summary>
4+
/// Contains the TCP settings of a connection.
5+
/// </summary>
6+
public class TcpSettings
7+
{
8+
/// <summary>
9+
/// Gets or sets a value in milliseconds that defines how often a keep-alive transmission is sent to an idle connection.
10+
/// </summary>
11+
public uint KeepAliveTime { get; set; }
12+
13+
/// <summary>
14+
/// Gets or sets a value in milliseconds that defines how often a keep-alive transmission
15+
/// is sent when no response is received from previous keep-alive transmissions.
16+
/// </summary>
17+
public uint KeepAliveInterval { get; set; }
18+
}

src/ArtemisNetClient/ConnectionFactory.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class ConnectionFactory
1919
private Func<IMessageIdPolicy> _messageIdPolicyFactory;
2020
private Func<string> _clientIdFactory;
2121
private SslSettings _sslSettings;
22+
private TcpSettings _tcpSettings;
2223

2324
public async Task<IConnection> CreateAsync(IEnumerable<Endpoint> endpoints, CancellationToken cancellationToken)
2425
{
@@ -31,13 +32,21 @@ public async Task<IConnection> CreateAsync(IEnumerable<Endpoint> endpoints, Canc
3132

3233
if (AutomaticRecoveryEnabled)
3334
{
34-
var autoRecoveringConnection = new AutoRecoveringConnection(LoggerFactory, endpointsList, RecoveryPolicy, MessageIdPolicyFactory, ClientIdFactory, _sslSettings);
35+
var autoRecoveringConnection = new AutoRecoveringConnection(
36+
LoggerFactory,
37+
endpointsList,
38+
RecoveryPolicy,
39+
MessageIdPolicyFactory,
40+
ClientIdFactory,
41+
_sslSettings,
42+
_tcpSettings
43+
);
3544
await autoRecoveringConnection.InitAsync(cancellationToken).ConfigureAwait(false);
3645
return autoRecoveringConnection;
3746
}
3847
else
3948
{
40-
var connectionBuilder = new ConnectionBuilder(LoggerFactory, MessageIdPolicyFactory, ClientIdFactory, _sslSettings);
49+
var connectionBuilder = new ConnectionBuilder(LoggerFactory, MessageIdPolicyFactory, ClientIdFactory, _sslSettings, _tcpSettings);
4150
return await connectionBuilder.CreateAsync(endpointsList.First(), cancellationToken).ConfigureAwait(false);
4251
}
4352
}
@@ -69,5 +78,10 @@ public Func<string> ClientIdFactory
6978
/// Gets the SASL settings on the factory.
7079
/// </summary>
7180
public SslSettings SSL => _sslSettings ??= new SslSettings();
81+
82+
/// <summary>
83+
/// Gets the TCP settings on the factory.
84+
/// </summary>
85+
public TcpSettings TCP => _tcpSettings ??= new TcpSettings();
7286
}
7387
}

0 commit comments

Comments
 (0)