public async Task PeekMultipleSessions_ShouldThrow()
        {
            await using (var scope = await ServiceBusScope.CreateWithQueue(enablePartitioning: false, enableSession: true))
            {
                await using var sender = new ServiceBusSenderClient(TestEnvironment.ServiceBusConnectionString, scope.QueueName);
                var messageCt = 10;
                var sessionId = Guid.NewGuid().ToString();
                // send the messages
                IEnumerable <ServiceBusMessage> sentMessages = GetMessages(messageCt, sessionId);
                await sender.SendRangeAsync(sentMessages);

                await using var receiver1 = new SessionReceiverClient(sessionId, TestEnvironment.ServiceBusConnectionString, scope.QueueName);
                await using var receiver2 = new SessionReceiverClient(sessionId, TestEnvironment.ServiceBusConnectionString, scope.QueueName);
                Dictionary <string, ServiceBusMessage> sentMessageIdToMsg = new Dictionary <string, ServiceBusMessage>();

                // peek the messages
                IAsyncEnumerable <ServiceBusMessage> peekedMessages1 = receiver1.PeekRangeBySequenceAsync(
                    fromSequenceNumber: 1,
                    maxMessages: messageCt);
                IAsyncEnumerable <ServiceBusMessage> peekedMessages2 = receiver2.PeekRangeBySequenceAsync(
                    fromSequenceNumber: 1,
                    maxMessages: messageCt);
                await peekedMessages1.GetAsyncEnumerator().MoveNextAsync();

                Assert.That(async() => await peekedMessages2.GetAsyncEnumerator().MoveNextAsync(), Throws.Exception);
            }
        }
        public async Task Peek_IncrementsSequenceNmber(int messageCt)
        {
            await using (var scope = await ServiceBusScope.CreateWithQueue(enablePartitioning: false, enableSession: true))
            {
                await using var sender = new ServiceBusSenderClient(TestEnvironment.ServiceBusConnectionString, scope.QueueName);
                var sessionId = Guid.NewGuid().ToString();
                // send the messages
                IEnumerable <ServiceBusMessage> sentMessages = GetMessages(messageCt, sessionId);
                await sender.SendRangeAsync(sentMessages);

                await using var receiver = new SessionReceiverClient(sessionId, TestEnvironment.ServiceBusConnectionString, scope.QueueName);

                long seq = 0;
                for (int i = 0; i < messageCt; i++)
                {
                    ServiceBusMessage msg = await receiver.PeekAsync();

                    Assert.IsTrue(msg.SystemProperties.SequenceNumber > seq);
                    if (seq > 0)
                    {
                        Assert.IsTrue(msg.SystemProperties.SequenceNumber == seq + 1);
                    }
                    seq = msg.SystemProperties.SequenceNumber;
                }
            }
        }
예제 #3
0
        public async Task PeekMultipleSessions_ShouldThrow()
        {
            var sender    = new ServiceBusSenderClient(ConnString, SessionQueueName);
            var messageCt = 10;
            var sessionId = Guid.NewGuid().ToString();
            // send the messages
            IEnumerable <ServiceBusMessage> sentMessages = GetMessages(messageCt, sessionId);
            await sender.SendRangeAsync(sentMessages);

            var receiver1 = new SessionReceiverClient(sessionId, ConnString, SessionQueueName);
            var receiver2 = new SessionReceiverClient(sessionId, ConnString, SessionQueueName);
            Dictionary <string, ServiceBusMessage> sentMessageIdToMsg = new Dictionary <string, ServiceBusMessage>();

            // peek the messages
            IAsyncEnumerable <ServiceBusMessage> peekedMessages1 = receiver1.PeekRangeBySequenceAsync(
                fromSequenceNumber: 1,
                maxMessages: messageCt);
            IAsyncEnumerable <ServiceBusMessage> peekedMessages2 = receiver2.PeekRangeBySequenceAsync(
                fromSequenceNumber: 1,
                maxMessages: messageCt);
            await peekedMessages1.GetAsyncEnumerator().MoveNextAsync();

            try
            {
                await peekedMessages2.GetAsyncEnumerator().MoveNextAsync();
            }
            catch (Exception)
            {
                return;
            }
            Assert.Fail("No exception!");
        }
예제 #4
0
        public async Task Peek_IncrementsSequenceNmber(int messageCt)
        {
            var sender    = new ServiceBusSenderClient(ConnString, SessionQueueName);
            var sessionId = Guid.NewGuid().ToString();
            // send the messages
            IEnumerable <ServiceBusMessage> sentMessages = GetMessages(messageCt, sessionId);
            await sender.SendRangeAsync(sentMessages);

            var receiver = new SessionReceiverClient(sessionId, ConnString, SessionQueueName);


            long seq = 0;

            for (int i = 0; i < messageCt; i++)
            {
                ServiceBusMessage msg = await receiver.PeekAsync();

                Assert.IsTrue(msg.SystemProperties.SequenceNumber > seq);
                if (seq > 0)
                {
                    Assert.IsTrue(msg.SystemProperties.SequenceNumber == seq + 1);
                }
                seq = msg.SystemProperties.SequenceNumber;
            }
        }
        public async Task Peek_Session(long?sequenceNumber, string partitionKey)
        {
            await using (var scope = await ServiceBusScope.CreateWithQueue(enablePartitioning: false, enableSession: true))
            {
                await using var sender = new ServiceBusSenderClient(TestEnvironment.ServiceBusConnectionString, scope.QueueName);
                var messageCt = 10;
                var sessionId = Guid.NewGuid().ToString();

                // send the messages
                IEnumerable <ServiceBusMessage> sentMessages = GetMessages(messageCt, sessionId, partitionKey);
                await sender.SendRangeAsync(sentMessages);

                Dictionary <string, ServiceBusMessage> sentMessageIdToMsg = new Dictionary <string, ServiceBusMessage>();
                foreach (ServiceBusMessage message in sentMessages)
                {
                    sentMessageIdToMsg.Add(message.MessageId, message);
                }

                // peek the messages
                await using var receiver = new SessionReceiverClient(sessionId, TestEnvironment.ServiceBusConnectionString, scope.QueueName);

                sequenceNumber ??= 1;
                IAsyncEnumerable <ServiceBusMessage> peekedMessages = receiver.PeekRangeBySequenceAsync(
                    fromSequenceNumber: (long)sequenceNumber,
                    maxMessages: messageCt);

                // verify peeked == send
                var ct = 0;
                await foreach (ServiceBusMessage peekedMessage in peekedMessages)
                {
                    var peekedText = Encoding.Default.GetString(peekedMessage.Body);
                    var sentMsg    = sentMessageIdToMsg[peekedMessage.MessageId];

                    sentMessageIdToMsg.Remove(peekedMessage.MessageId);
                    Assert.AreEqual(Encoding.Default.GetString(sentMsg.Body), peekedText);
                    Assert.AreEqual(sentMsg.PartitionKey, peekedMessage.PartitionKey);
                    Assert.IsTrue(peekedMessage.SystemProperties.SequenceNumber >= sequenceNumber);
                    TestContext.Progress.WriteLine($"{peekedMessage.Label}: {peekedText}");
                    ct++;
                }
                if (sequenceNumber == 1)
                {
                    Assert.AreEqual(messageCt, ct);
                }
            }
        }
        public async Task RoundRobinSessions()
        {
            await using (var scope = await ServiceBusScope.CreateWithQueue(enablePartitioning: false, enableSession: true))
            {
                await using var sender = new ServiceBusSenderClient(TestEnvironment.ServiceBusConnectionString, scope.QueueName);
                var messageCt             = 10;
                HashSet <string> sessions = new HashSet <string>()
                {
                    "1", "2", "3"
                };

                // send the messages
                foreach (string session in sessions)
                {
                    await sender.SendRangeAsync(GetMessages(messageCt, session));
                }

                var receiverClient = new QueueReceiverClient(TestEnvironment.ServiceBusConnectionString, scope.QueueName);
                var sessionId      = "";
                // create receiver not scoped to a specific session
                for (int i = 0; i < 10; i++)
                {
                    SessionReceiverClient sessionClient = receiverClient.GetSessionReceiverClient();
                    IAsyncEnumerable <ServiceBusMessage> peekedMessages = sessionClient.PeekRangeBySequenceAsync(
                        fromSequenceNumber: 1,
                        maxMessages: 10);

                    await foreach (ServiceBusMessage peekedMessage in peekedMessages)
                    {
                        Assert.AreEqual(sessionClient.SessionId, peekedMessage.SessionId);
                    }
                    TestContext.Progress.WriteLine(sessionId);
                    sessionId = sessionClient.SessionId;

                    // Close the session client when we are done with it. Since the sessionClient doesn't own the underlying connection, the connection remains open, but the session link will be closed.
                    await sessionClient.CloseAsync();
                }
            }
        }