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; } } }
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!"); }
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(); } } }