Example #1
0
        public void FailedPublish(IModel channel, BasicNackEventArgs args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            ProcessArgsAndRun(args.Multiple, args.DeliveryTag, x => x.Failure());
        }
        public void Should_mark_failure()
        {
            const int sequenceNumber = 34456;
            channel.Stub(x => x.NextPublishSeqNo).Return(sequenceNumber);

            var success = false;
            var failure = false;

            Action successCallback = () => success = true;
            Action failureCallback = () => failure = true;

            publisherConfirms.RegisterCallbacks(channel, successCallback, failureCallback);

            var args = new BasicNackEventArgs
            {
                DeliveryTag = sequenceNumber,
                Multiple = false
            };

            publisherConfirms.FailedPublish(channel, args);

            success.ShouldBeFalse();
            failure.ShouldBeTrue();
        }
 protected override void OnBrokerRejectedMessage(IModel model, BasicNackEventArgs args)
 {
     OnBrokerRejectedMessageIsCall = true;
 }
Example #4
0
 private void PublishModelOnBasicNacks(IModel model, BasicNackEventArgs args)
 {
     if (args.Multiple)
         log.WarnFormat("Broker nacked all deliveries up to and including #{0}", args.DeliveryTag);
     else
         log.WarnFormat("Broker nacked delivery #{0}", args.DeliveryTag);
 }
        public void Should_mark_success_up_to_sequence_number_when_multiple_is_true()
        {
            const string expectedOutput = "Success0 Success1 Success2 Success3 Success4 Success5 --multiple ack of 5 complete --Failure6 Failure7 Failure8 ";
            var writer = new StringWriter();
            //var writer = Console.Out;

            Action<ulong> registerCallback = sequenceNumber =>
            {
                var model = MockRepository.GenerateStub<IModel>();
                model.Stub(x => x.NextPublishSeqNo).Return(sequenceNumber);
                publisherConfirms.RegisterCallbacks(model,
                    () => writer.Write("Success{0} ", sequenceNumber),
                    () => writer.Write("Failure{0} ", sequenceNumber));
            };

            for (ulong i = 0; i < 10; i++)
            {
                registerCallback(i);
            }

            var args = new BasicAckEventArgs
            {
                DeliveryTag = 5, // should callback success up to and including seq no 5
                Multiple = true
            };

            publisherConfirms.SuccessfulPublish(channel, args);

            writer.Write("--multiple ack of 5 complete --");

            var args2 = new BasicNackEventArgs
            {
                DeliveryTag = 8, // should callback failure for 6, 7, 8
                Multiple = true
            };

            publisherConfirms.FailedPublish(channel, args2);

            writer.ToString().ShouldEqual(expectedOutput);
        }
		private void OnChannelNack(
			IModel channel,
			BasicNackEventArgs args)
		{
			TaskCompletionSource<string> _taskCompletionSource;
			var _confirmedDeliveryTags = this.c_unconfirmedMessages.Keys.Where(deliveryTag => deliveryTag <= args.DeliveryTag);
			foreach (var _confirmedDeliveryTag in _confirmedDeliveryTags)
			{
				if (!this.c_unconfirmedMessages.TryRemove(_confirmedDeliveryTag, out _taskCompletionSource))
				{
					throw new ApplicationException("Could not remove delivery tag entry");
				}

				_taskCompletionSource.SetResult((string)_taskCompletionSource.Task.AsyncState);
			}
		}
 public void HandleBasicNack(ulong deliveryTag,
                             bool multiple,
                             bool requeue)
 {
     BasicNackEventArgs e = new BasicNackEventArgs();
     e.DeliveryTag = deliveryTag;
     e.Multiple = multiple;
     e.Requeue = requeue;
     OnBasicNack(e);
 }
 void OnBasicNacks(object model, BasicNackEventArgs args)
 {
     if (args.Multiple)
     {
         ulong[] ids = _published.Keys.Where(x => x <= args.DeliveryTag).ToArray();
         foreach (var id in ids)
         {
             PendingPublish value;
             if (_published.TryRemove(id, out value))
                 value.Nack();
         }
     }
     else
     {
         PendingPublish value;
         if (_published.TryRemove(args.DeliveryTag, out value))
             value.Nack();
     }
 }
        public virtual void OnBasicNack(BasicNackEventArgs args)
        {
            EventHandler<BasicNackEventArgs> handler;
            lock (m_eventLock)
            {
                handler = m_basicNack;
            }
            if (handler != null)
            {
                foreach (EventHandler<BasicNackEventArgs> h in handler.GetInvocationList())
                {
                    try
                    {
                        h(this, args);
                    }
                    catch (Exception e)
                    {
                        OnCallbackException(CallbackExceptionEventArgs.Build(e, "OnBasicNack"));
                    }
                }
            }

            handleAckNack(args.DeliveryTag, args.Multiple, true);
        }
Example #10
0
        protected override void OnModelBasicNacks(Object sender, BasicNackEventArgs args)
        {
            base.OnModelBasicNacks(sender, args);

            _log.Info($"consumer-model basic.nack received (delivery-tag: {args.DeliveryTag}, multiple: {args.Multiple})");
        }
 private void ModelOnBasicNacks(IModel model, BasicNackEventArgs args)
 {
     MarkAsConfirmed(args.DeliveryTag, args.Multiple);
 }
Example #12
0
 private void ModelOnBasicNacks(object sender, BasicNackEventArgs e)
 {
     _logger.Debug($"Nack, tag: {e.DeliveryTag}, multiple: {e.Multiple}");
     Nack?.Invoke(this, e);
 }
Example #13
0
 private void OnNack(object sender, BasicNackEventArgs args)
 {
     eventBus.Publish(MessageConfirmationEvent.Nack((IModel)sender, args.DeliveryTag, args.Multiple));
 }
 protected override void OnBrokerRejectedMessage(object sender, BasicNackEventArgs args)
 {
     OnBrokerRejectedMessageIsCall = true;
 }
Example #15
0
 private void ModelOnBasicNacks(object model, BasicNackEventArgs e)
 {
     HandleConfirm(e.DeliveryTag, e.Multiple, x => x.OnNack());
 }
Example #16
0
 private void ModelOnBasicNacks(IModel model, BasicNackEventArgs args)
 {
     HandleConfirm(args.DeliveryTag, args.Multiple, x => x.OnNack());
 }
        public void FailedPublish(IModel channel, BasicNackEventArgs args)
        {
            Preconditions.CheckNotNull(args, "args");

            ProcessArgsAndRun(args.Multiple, args.DeliveryTag, x => x.Failure());
        }
Example #18
0
 protected virtual void OnModelBasicNacks(Object sender, BasicNackEventArgs args) { }
 public virtual void OnBasicNack(BasicNackEventArgs args)
 {
     m_delegate.OnBasicNack(args);
 }
Example #20
0
 private void BasicNackEventHandler(object sender, BasicNackEventArgs e)
 {
     this.BasicNacks?.Invoke(sender, e);
 }
        public virtual void OnBasicNack(BasicNackEventArgs args)
        {
            BasicNackEventHandler handler;
            lock (m_eventLock)
            {
                handler = m_basicNack;
            }
            if (handler != null)
            {
                foreach (BasicNackEventHandler h in handler.GetInvocationList()) {
                    try {
                        h(this, args);
                    } catch (Exception e) {
                        CallbackExceptionEventArgs exnArgs = new CallbackExceptionEventArgs(e);
                        exnArgs.Detail["context"] = "OnBasicNack";
                        OnCallbackException(exnArgs);
                    }
                }
            }

            handleAckNack(args.DeliveryTag, args.Multiple, true);
        }
		private void OnChannelNack(
			IModel channel,
			BasicNackEventArgs args)
		{
			// Todo
		}
 /// <summary>
 /// CONFIRM mode - sent when 
 /// used to nack publisher confirm
 /// </summary>
 /// <param name="model"></param>
 /// <param name="args"></param>
 protected virtual void Channel_BasicNacks( IModel model, BasicNackEventArgs args )
 {
     this.Tracer.TraceEvent ( System.Diagnostics.TraceEventType.Error, 0, "[{0}] bus nack error, delivery tag {1}, multiple {2}, requeue {3} ", this, args.DeliveryTag, args.Multiple, args.Requeue );
     //SUPPORT multi confirm mode
     TaskCompletionSource<int> tcs;
     if (this.ConfirmTaskCompletions.TryRemove ( args.DeliveryTag, out tcs ))
     {
         //standarize on error codes what does it mean to return -1???
         tcs.SetResult ( -1 );
         //react depending on the reason: reconnect or discharge all pending RPC requests
     }
 }
Example #24
0
		private void OnChannelNacked(
			IModel channel,
			BasicNackEventArgs args)
		{
			this.c_logger.DebugFormat("OnChannelNacked Starting, is multiple = {0} and delivery tag = {1}", args.Multiple, args.DeliveryTag);

			this.ProcessDeliveryTags(
				args.Multiple,
				args.DeliveryTag,
				publication => publication.SetResult(PublicationResultStatus.Nacked));

			this.c_logger.DebugFormat("OnChannelNacked Completed, is multiple = {0} and delivery tag = {1}", args.Multiple, args.DeliveryTag);
		}