/// <summary> /// Попытаться обработать. /// </summary> /// <param name="id">Идентификатор сообщения.</param> /// <returns>True, если сообщения можно обрабатывать.</returns> private async Task <bool> TryProcessAsync(string id) { try { var isProcessed = await _uniqueMessageMarker.IsProcessed(id); if (isProcessed) { return(false); } var expiry = _options.LockSeconds ?? 600; if (expiry <= 0) { await _uniqueMessageMarker.TakeLockAsync(id); } else { await _uniqueMessageMarker.TakeLockAsync(id, TimeSpan.FromSeconds(expiry)); } } catch (Exception e) { _logger.LogError(e, "Не удалось запросить статус обработки сообщения или поставить блокировку."); } return(true); }
public async Task ShouldSetDedupFlagOnAckAsync(string messageId) { #region Arrange var ctx = new MessageContext( null, new MqMessageData( null !, null, Guid.Parse(messageId), null, 0, false, new BasicDeliverEventArgs() ) ); var before = await _uniqueMessageMarker.IsProcessed(messageId); Assert.IsFalse(before, "Сообщение не должно быть обработано."); _uniqueMessagesSubscriberMiddleware.SetNext(x => Task.FromResult <Acknowledgement>(Ack.Ok)); #endregion Arrange var acknowledgement = await _uniqueMessagesSubscriberMiddleware.HandleAsync(ctx); #region Assert Assert.Multiple(async() => { var after = await _uniqueMessageMarker.IsProcessed(messageId); Assert.IsInstanceOf <Ack>(acknowledgement); Assert.IsTrue(after, "После успешной обработки флаг дедупликации не поднят."); }); #endregion Assert }