Skip to content

Commit f82caea

Browse files
authored
feat: Add configurable visibility timeout renewal (MassTransit#6173)
* feat: Add configurable visibility timeout extension
1 parent d76c511 commit f82caea

5 files changed

Lines changed: 30 additions & 1 deletion

File tree

src/Transports/MassTransit.AmazonSqsTransport/AmazonSqsTransport/AmazonSqsReceiveLockContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ TimeSpan CalculateDelay(int timeout)
121121

122122
var delay = CalculateDelay(visibilityTimeout);
123123

124-
visibilityTimeout = Math.Min(60, visibilityTimeout);
124+
visibilityTimeout = Math.Min(_settings.MaxVisibilityTimeoutRenewal, visibilityTimeout);
125125

126126
while (_locked && !_activeTokenSource.IsCancellationRequested)
127127
{

src/Transports/MassTransit.AmazonSqsTransport/AmazonSqsTransport/Configuration/AmazonSqsReceiveEndpointConfiguration.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ public override IEnumerable<ValidationResult> Validate()
106106
var visibilityTimeout = TimeSpan.FromSeconds(_settings.VisibilityTimeout);
107107
if (_settings.MaxVisibilityTimeout < visibilityTimeout)
108108
yield return this.Failure("MaxVisibilityTimeout", "Must be greater than or equal to VisibilityTimeout");
109+
110+
if (_settings.MaxVisibilityTimeoutRenewal < 0)
111+
yield return this.Failure("MaxVisibilityTimeoutRenewal", "must be >= 0 (values less than 60 will be set to 60)");
112+
113+
if (_settings.MaxVisibilityTimeoutRenewal > 43200)
114+
yield return this.Failure("MaxVisibilityTimeoutRenewal", "must be <= 43200 seconds (12 hours per AWS SQS limits)");
109115

110116
foreach (var result in base.Validate())
111117
yield return result.WithParentKey(queueName);
@@ -168,6 +174,11 @@ public TimeSpan MaxVisibilityTimeout
168174
set => _settings.MaxVisibilityTimeout = value > MaxAllowedVisibilityTimeout ? MaxAllowedVisibilityTimeout : value;
169175
}
170176

177+
public int MaxVisibilityTimeoutRenewal
178+
{
179+
set => _settings.MaxVisibilityTimeoutRenewal = value < 60 ? 60 : value;
180+
}
181+
171182
public void Subscribe<T>(Action<IAmazonSqsTopicSubscriptionConfigurator>? configure = null)
172183
where T : class
173184
{

src/Transports/MassTransit.AmazonSqsTransport/AmazonSqsTransport/ReceiveSettings.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ public interface ReceiveSettings :
5151
/// </summary>
5252
int RedeliverVisibilityTimeout { get; set; }
5353

54+
/// <summary>
55+
/// The number of seconds to extend the visibility timeout when renewing message visibility during processing.
56+
/// Must be at least 60 seconds per AWS SQS API constraints.
57+
/// See <see href="https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html">ChangeMessageVisibility</see>.
58+
/// </summary>
59+
int MaxVisibilityTimeoutRenewal { get; set; }
60+
5461
string? QueueUrl { get; set; }
5562

5663
/// <summary>

src/Transports/MassTransit.AmazonSqsTransport/AmazonSqsTransport/Topology/QueueReceiveSettings.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public QueueReceiveSettings(IAmazonSqsEndpointConfiguration configuration, strin
1919
VisibilityTimeout = 30;
2020
RedeliverVisibilityTimeout = 1;
2121
MaxVisibilityTimeout = TimeSpan.FromHours(12);
22+
MaxVisibilityTimeoutRenewal = 60;
2223

2324
ConcurrentDeliveryLimit = 1;
2425

@@ -43,6 +44,8 @@ public QueueReceiveSettings(IAmazonSqsEndpointConfiguration configuration, strin
4344

4445
public TimeSpan MaxVisibilityTimeout { get; set; }
4546

47+
public int MaxVisibilityTimeoutRenewal { get; set; }
48+
4649
public string? QueueUrl { get; set; }
4750

4851
public Uri GetInputAddress(Uri hostAddress)

src/Transports/MassTransit.AmazonSqsTransport/Configuration/IAmazonSqsReceiveEndpointConfigurator.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ public interface IAmazonSqsReceiveEndpointConfigurator :
3232
/// </summary>
3333
public TimeSpan MaxVisibilityTimeout { set; }
3434

35+
/// <summary>
36+
/// Sets the number of seconds to extend the visibility timeout when renewing message visibility during processing.
37+
/// Values less than 60 will be set to 60 seconds (AWS SQS minimum for ChangeMessageVisibility).
38+
/// Defaults to 60 seconds.
39+
/// See <see href="https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html">ChangeMessageVisibility</see>.
40+
/// </summary>
41+
int MaxVisibilityTimeoutRenewal { set; }
42+
3543
/// <summary>
3644
/// Bind an existing exchange for the message type to the receive endpoint by name
3745
/// </summary>

0 commit comments

Comments
 (0)