public RabbitConsumerAttribute(
     string queueName,
     AcknowledgementType acknowledgementType = AcknowledgementType.AutoAck,
     bool nackOnException = true)
 {
     this.QueueName           = queueName;
     this.AcknowledgementType = acknowledgementType;
     this.NackOnException     = nackOnException;
 }
    public async Task ShouldNotSendAcknowledgeReceived_WhenAcknowledgementTypeIsNotReceived(
        AcknowledgementType acknowledgementType,
        MessageWithMetadata message,
        [Frozen] Mock <IConnection> connection,
        ReceivedAcknowledgingConnection sut)
    {
        connection.Setup(x => x.ReceiveAsync(Cts.Token))
        .ReturnsAsync(message);

        message.Metadata !.AcknowledgementType = acknowledgementType;

        await sut.ReceiveAsync(Cts.Token);

        connection.Verify(x => x.SendAsync(It.IsAny <object>(), Cts.Token), Times.Never);
    }
Esempio n. 3
0
    public async ValueTask SendAsync(
        object message,
        Action <MessageMetadata>?metadataSetter,
        AcknowledgementType acknowledgementType,
        CancellationToken cancellationToken)
    {
        string?subscriptionId = null;  // For acknowledgement.

        if (!IsConnected)
        {
            throw new InvalidOperationException("Not connected.");
        }

        var metadata = _metadataFactory.CreateFor(message);

        metadataSetter?.Invoke(metadata);
        metadata.AcknowledgementType = acknowledgementType;

        var reconnectedTimes = 0;

        while (reconnectedTimes < _reconnectRetryCount)
        {
            // This creates a deadlock. Come up with another solution.
            // Do not allow starting new operations while reconnect is happening.
            // await WaitForReconnectAsync(cancellationToken).ConfigureAwait(false);

            var resource = GetConnectionResource();

            try
            {
                TaskCompletionSource?tcs = null;

                if (acknowledgementType == AcknowledgementType.Received)
                {
                    // Setup subscription for acknowledgement.

                    tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);

                    ValueTask Handler(AcknowledgeReceived acknowledgeReceived)
                    {
                        if (acknowledgeReceived.MessageId == metadata.MessageId)
                        {
                            tcs.SetResult();
                        }

                        return(default);
 public void ShouldRequireAcknowledgement_WhenAcknowledgementTypeIsNotNone(
     AcknowledgementType sut)
 {
     Assert.True(sut.IsAcknowledgementRequired());
 }
Esempio n. 5
0
 /// <summary>
 /// Parameterized constructor
 /// </summary>
 /// <param name="dtype">Delivery receipt type</param>
 /// <param name="atype">Acknowledgement receipt type</param>
 /// <param name="intermediateNotification">Whether intermediate notification is requested.</param>
 public registered_delivery(DeliveryReceiptType dtype, AcknowledgementType atype, bool intermediateNotification) : base(0)
 {
     this.DeliveryReceipt            = dtype;
     this.OriginationAcknowledgement = atype;
     this.IntermediateNotification   = intermediateNotification;
 }
Esempio n. 6
0
 public static bool IsAcknowledgementRequired(this AcknowledgementType acknowledgementType)
 => acknowledgementType != AcknowledgementType.None;