0

我在 Web 角色上有一个 WCF,然后是一个工作角色来处理 WCF 添加到天蓝色队列的消息。

我正在执行以下操作:

var queue = queueStorage.GetQueueReference("myqueue");

var message = new CloudQueueMessage(string.Format("{0},{1}", pWord,processed));
queue.AddMessage(message);

然后我想等到消息处理完毕,但我不知道我的队列对象是否会自行更新,或者我必须对此做些什么。

在我的工人角色上,我有以下内容:

这是我的 onStart 方法:

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
        inputQueue = queueClient.GetQueueReference("myqueue");

然后在我的 Run 方法上:

while (true)
            {
                try
                {
                    // Retrieve and process a new message from the queue.
                    msg = inputQueue.GetMessage();
                    if (msg != null)
                    {
                        result = processMessage(msg);

在我的 processMessage 方法上:

var messageParts = msg.AsString.Split(new char[] { ',' });
            var word = messageParts[0];
            var processed = Convert.ToBoolean(messageParts[2]);
            word = "recibido";
            processed = true;
            addMessageToQueue2(userId,processed);
            return 1;

将消息添加到队列是:

var queue = outputQueue.GetQueueReference("myQueue");
            var message = new CloudQueueMessage(string.Format("{0},{1}", pWord, pProcessed));
            queue.AddMessage(message);

我对队列相当陌生,但我认为这应该可以工作,所以我只需要等到消息被处理但不知道它在内部是如何工作的。

4

1 回答 1

0

不太清楚等到消息处理完毕是什么意思。使用 Azure 队列,操作非常简单:

  • 将消息放入队列(带有消息 TTL)
  • 从队列中读取消息(处理超时)。此处理超时表示“我保证在达到此超时之前完成处理此消息,然后删除此消息。
  • 队列消息保留在队列中,但在超时期间对所有其他读者不可见。
  • 然后消息阅读器从队列中删除消息。
  • 假设读取队列消息的代码在承诺的超时到期之前删除了消息,那么在 QueueLand 中一切正常。但是:如果处理超出超时期限,则消息将再次可见。而且...如果其他人随后阅读了该消息,则原始阅读者将失去删除它的权利(他们在尝试时会遇到异常)。

所以:长话短说:您可以在规定的超时期限内处理任意时间的消息,然后将其删除。如果您的代码在处理过程中崩溃,该消息最终会重新出现以供其他人阅读。如果你想处理有害消息,只需查看消息的DequeueCount属性,看看它被阅读了多少次(如果超过某个阈值,对消息做一些特殊的事情,比如把它藏在一个 blob 或 table 行中供开发团队将来检查)。

有关所有记录的队列限制(以及与服务总线队列的详细并排比较),请参阅本文。

于 2013-04-30T02:17:56.403 回答