【发布时间】:2017-03-28 13:46:52
【问题描述】:
在MS documentation 之后,从订阅接收消息并不困难。但是,如果我希望我的应用程序在每次发布新消息时都收到一条消息 - 持续轮询。因此 SubscriptionClient 类的 OnMessage() 方法。
MS documentation 说: “...当调用 OnMessage 时,客户端会启动一个内部消息泵,不断轮询队列或订阅。这个消息泵由一个无限循环组成,发出 Receive() 调用。如果调用超时,它会发出下一个 Receive() 调用。 ..."
但是当应用程序运行时,在调用 OnMessage() 方法的那一刻,只接收到最新消息。当发布新消息时,持续轮询似乎不起作用。在尝试了许多不同的方法之后我可以使这项工作并让应用程序在收到新消息的那一刻做出反应的唯一方法是将代码放入一个具有无限循环的单独任务中。这在很多层面上似乎完全错误!(见下面的代码)。
谁能帮助我更正我的代码或发布一个工作示例以在没有循环的情况下完成相同的功能?谢谢!
public void ReceiveMessageFromSubscription(string topicName, string subscriptionFilter)
{
var newMessage = new MessageQueue();
int i = 0;
Task listener = Task.Factory.StartNew(() =>
{
while (true)
{
SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionFilter);
Dictionary<string, string> retrievedMessage = new Dictionary<string, string>();
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromMinutes(1);
Client.OnMessage((message) =>
{
try
{
retrievedMessage.Add("messageGuid", message.Properties["MessageGuid"].ToString());
retrievedMessage.Add("instanceId", message.Properties["InstanceId"].ToString());
retrievedMessage.Add("pId", message.Properties["ProcessId"].ToString());
retrievedMessage.Add("processKey", message.Properties["ProcessKey"].ToString());
retrievedMessage.Add("message", message.Properties["Message"].ToString());
newMessage.AnnounceNewMessage(retrievedMessage); // event ->
message.Complete(); // Remove message from subscription.
}
catch (Exception ex)
{
string exmes = ex.Message;
message.Abandon();
}
}, options);
retrievedMessage.Clear();
i++;
Thread.Sleep(3000);
}
});
}
【问题讨论】:
标签: c# azureservicebus