Quantcast
Channel: Service Bus forum
Viewing all articles
Browse latest Browse all 1916

MessageReceiver.Abort does not abort until serverWaitTime has expired (Bug?)

$
0
0

Hi,

I'm having an issue with aborting receive operations from Service Bus for Windows Server 1.0. The same issue might occur when running against Azure but I have not tested that yet.

My scenario is this:

I have a receive loop in a separate thread which I start as a task (where I call the Receive method over and over again to get messages). In some cases I want to abort receiving, so then I call the Abort method from another thread.

The issues is that the Receive method doesn't abort in a timely fashion if I call Abort shortly after the Receive method was called. The Receive method continues to run until the serverWaitTime expires (the timeout period provided to the receive method, default 1 min if not specified).

I have created a small reproduction of the issue where I do a Thread.Sleep(...) before calling Abort. In this case the receive operation Aborts quickly after my sleep as expected. However I would prefer not to have a Thread.Sleep since I assume that the time for this delay will vary between different setups. In my scenario about 300ms seemed to be the magic number.

Does anyone have a better solution or workaround to this other than having a Thread.Sleep?

Or could anyone from the Service Bus team comment on this?

Below is a snippet of my reproduction of the issue:

public void TestAbort(string connectionString)
{
    // Some delays I have tried with.
    var tooShortDelay = 100; // With this delay the stop watch shows about 10sec (the specified timeout)
    var delayWhichWorks = 400; // With this delay the stopwatch shows about 400ms

    var messageFactory = MessagingFactory.CreateFromConnectionString(connectionString);
    var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

    var queueName = "MyQueueName";
    if (namespaceManager.QueueExists(queueName))
    {
        namespaceManager.DeleteQueue(queueName);
    }

    namespaceManager.CreateQueue(queueName);

    var queueClient = messageFactory.CreateQueueClient(queueName);
    var stopwatch = Stopwatch.StartNew();

    var task = Task.Run(() => queueClient.Receive(TimeSpan.FromSeconds(10)));

    Thread.Sleep(tooShortDelay);
    queueClient.Abort();
    task.Wait();

    Console.WriteLine("Time to abort receive operation: " + stopwatch.ElapsedMilliseconds);
    messageFactory.Close();
}

Regards,

//Thomas


Viewing all articles
Browse latest Browse all 1916

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>