示例#1
0
        /// <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);
        }
示例#2
0
        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
        }