public async Task Recover(RecoverabilityContext context)
        {
            var sender = AzureServiceBusClientCache.GetSender(context.Endpoint.Settings.ConnectionString);
            var count  = _getRecoveryCount(context.Message, context);

            var retryMessage = context.Message.Clone();

            retryMessage.MessageId = Guid.NewGuid().ToString();
            retryMessage.UserProperties.Add("OriginalMessageId", context.Message.MessageId);
            retryMessage.UserProperties.Add("RecoveryCount", ++count);

            await sender.ScheduleMessageAsync(
                retryMessage,
                this._retryStrategy.GetNextDateUtc(++count)
                );

            //complete the original message - we've already scheduled a clone
            await _completeImmediateRetryPolicy.ExecuteAsync(() =>
                                                             context.Receiver.CompleteAsync(context.Message.SystemProperties.LockToken)
                                                             );
        }
コード例 #2
0
        protected Task _dispatch(string messageTypeIdentifier, byte[] messageBody, IEndpoint endpoint, MessageMetaData meta = null)
        {
            var message = new Message(messageBody);
            var sender  = AzureServiceBusClientCache.GetSender(endpoint.Settings.ConnectionString);

            _metaDataMapper.ApplyMetaData(message, meta, messageTypeIdentifier);

            DateTime?scheduleAtUtc = null;

            if (meta != null && meta.DispatchDelay.HasValue)
            {
                //var baseDate = meta.CreatedAtUtc.HasValue ? meta.CreatedAtUtc.Value : DateTime.UtcNow;
                var baseDate = DateTime.UtcNow;
                scheduleAtUtc = baseDate.Add(meta.DispatchDelay.Value);
            }
            if (scheduleAtUtc.HasValue)// && scheduleAtUtc > DateTime.UtcNow.AddMilliseconds(400))
            {
                return(sender.ScheduleMessageAsync(message, scheduleAtUtc.Value));
            }
            return(sender.SendAsync(message));
        }
        public async Task Recover(RecoverabilityContext context) // int timesQueued, Endpoint endpoint, IMessageReceiver receiver, Message controlMessage = null, string description = null, Exception exc = null)
        {
            if (IsControlMessage(context.Message))               //never try to reschedule the control messages themselves
            {
                return;
            }

            var count = context.TempData.ContainsKey("ControlMessageContent") ?
                        ((RecoverabilityControlMessage)context.TempData["ControlMessageContent"]).RecoveryCount
                : 0;
            var sender       = AzureServiceBusClientCache.GetSender(context.Endpoint.Settings.ConnectionString);
            var retryMessage = new RecoverabilityControlMessage(context.Message.SystemProperties.SequenceNumber, ++count);

            //schedule a special control message to be delivered in the future to tell the the deferred message to be retrieved and re processed
            await sender.ScheduleMessageAsync(
                _createServiceBusMessage(retryMessage),
                this._retryStrategy.GetNextDateUtc(retryMessage.RecoveryCount)
                );

            //defer the current message / first time through
            if (!context.TempData.ContainsKey("ControlMessage"))
            {
                await context.Receiver.DeferAsync(context.Message.SystemProperties.LockToken);
            }
            else //already deferred. complete the control message / we just sent a new one above
            {
                await _completeImmediateRetryPolicy.ExecuteAsync(() =>
                                                                 context.Receiver.CompleteAsync(((Message)context.TempData["ControlMessage"]).SystemProperties.LockToken)
                                                                 );

                //release the lock on the current deferred message
                await _completeImmediateRetryPolicy.ExecuteAsync(() =>
                                                                 context.Receiver.AbandonAsync(context.Message.SystemProperties.LockToken)
                                                                 );
            }
        }