Azure / amqpnetlite

AMQP 1.0 .NET Library
Apache License 2.0
401 stars 143 forks source link

Issue receiving from TestAmqpBroker.exe #489

Closed vedion closed 2 years ago

vedion commented 2 years ago

Hi,

I have a problem receiving from TestAmqpBroker.exe if the ReceiverLink has previously tried to receive.

Steps:

1) Create "receiverConnection" 2) Create first "receiverSession" and "receiverLink" 3) Try to receive message with first "receiverLink" (no message yet) 4) Close "receiverSession" and "receiverLink" (not "receiverConnection") 5) Create second "receiverSession" and "receiverLink" 6) Try to receive message with second "receiverLink" (no message yet) 7) Create "senderConnection", "senderSession" and "senderLink" 8) Send message 9) Try to receive message with second "receiverLink" (expected to receive message here)

When testing with another broker (EDX toolbox) then it works fine.

Is this a bug?

Best Regards, Anders Havn

` using Amqp;

string credentials = "guest:guest"; string host = "localhost:5672"; string connectionString = "amqp://" + credentials + "@" + host;

string queueName = "TestQueue";

Address address = new Address(connectionString); ConnectionFactory connectionFactory = new ConnectionFactory();

var senderMessage = "test";

// Connection reused for receiver sessions Connection receiveConnection = await connectionFactory.CreateAsync(address);

// First ReceiveLink: // - No message received // - Session and ReceiverLink closed Session firstReceiveSession = new Session(receiveConnection); ReceiverLink firstReceiverLink = new ReceiverLink(firstReceiveSession, "receiver-link1", queueName); await firstReceiverLink.ReceiveAsync(TimeSpan.FromMilliseconds(100)); await firstReceiverLink.CloseAsync(); await firstReceiveSession.CloseAsync();

// Second ReceiveLink: // - No message received // - Session and ReceiverLink NOT closed Session secondReceiveSession = new Session(receiveConnection); ReceiverLink secondReceiverLink = new ReceiverLink(secondReceiveSession, "receiver-link2", queueName); await secondReceiverLink.ReceiveAsync(TimeSpan.FromMilliseconds(100)); // FIX: Remove this line

// SenderLink: // - Message sent // - Connection, Session and SenderLink NOT closed Connection senderConnection = await connectionFactory.CreateAsync(address); Session senderSession = new Session(senderConnection); SenderLink senderLink = new SenderLink(senderSession, "sender-link", queueName); await senderLink.SendAsync(new Message(senderMessage));

// Second ReceiveLink: var receivedMessage = await secondReceiverLink.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); if (receivedMessage == null) { Console.WriteLine("No message received"); } else { Console.WriteLine($"Second message received: {receivedMessage.Body}"); secondReceiverLink.Accept(receivedMessage); } await secondReceiverLink.CloseAsync(); await secondReceiveSession.CloseAsync(); await receiveConnection.CloseAsync();

await senderLink.CloseAsync(); await senderSession.CloseAsync(); await senderConnection.CloseAsync(); `

xinchen10 commented 2 years ago

The test broker has been used primarily for unit tests, so don't be surprised if you see other issues with it.

vedion commented 2 years ago

Thank you again for the quick fix!