繁体   English   中英

如何减少Azure MessageReceiver消息泵?

[英]How do you drain down an Azure MessageReceiver message-pump?

我有一个MessageReceiver ,它从队列中抽取消息:

var factory = MessagingFactory.CreateFromConnectionString(connectionString);

var receiver = factory.CreateMessageReceiver(queuePath);

receiver.OnMessageAsync(HandleBrokeredMessageAsync);

HandleBrokeredMessageAsync是我的委托,接收方将消息泵入其中。

当我在接收器上调用Close()时,它将停止从队列中进一步发送消息。 为了避免潜在的竞争状况,我想确保所有待处理的处理在返回控制之前都已完成。

我考虑过HandleBrokeredMessageAsync每次调用跟踪到ConcurrentBag<T> ,并在完成后将其从包中删除。 我将使用BlockingCollection<T>来阻止进程,直到排空完成为止,但尚不清楚何时调用CompleteAdding() :我会在调用Close()之后调用它,但是调用Close()之间是否会有间隙Close()以及随后传递给处理程序的消息?

receiver.Close();
pendingMessages.CompleteAdding(); 
// Can additional messages be pumped after this?

在这里查看示例,因为它使用ManualResetEvent协调Run()方法的关闭和Close操作。 在您检查消息处理并停在那里(不接受下一条消息进行处理)然后在所有这些并发处理器都完成后调用close时,类似的方法可能会起作用?

https://stackoverflow.com/a/16739691/1078351

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM