Azure:如何将消息从毒性队列移动回主队列?

vbn*_*vbn 12 message-queue azure azure-sdk-.net poison-queue

我想知道是否有可以在队列之间移动消息的工具或库?目前,我正在做类似下面的事情

public static void ProcessQueueMessage([QueueTrigger("myqueue-poison")] string message, TextWriter log)
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connString);
    CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
    CloudQueue queue = queueClient.GetQueueReference("myqueue");
    queue.CreateIfNotExists();

    var messageData = JsonConvert.SerializeObject(data, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
    queue.AddMessage(new CloudQueueMessage(messageData));
}
Run Code Online (Sandbox Code Playgroud)

Tan*_*gan 7

自 2020 年起,Azure 存储资源管理器版本 1.15.0 现在可以执行此操作。https: //github.com/microsoft/AzureStorageExplorer/issues/1064


Gau*_*tri 6

本质上Azure存储不支持将消息从一个队列移动到另一个队列.你需要自己做这件事.

实现将消息从一个队列移动到另一个队列的一种方法是将消息从源队列中出列(通过调用GetMessages),读取消息的内容,然后在目标队列中创建新消息.您可以使用Storage Client Library执行此操作.

我想到的一个移动消息的工具是Cerebrata Azure Management Studio.它具有此功能.

截至(2018-09-11)Microsoft Azure存储资源管理器 1.4.1版不支持移动队列消息.

  • 撰写本文时,Azure Storage Explorer似乎不支持此功能. (5认同)

Mit*_*eat 5

截至(2018-09-11),Microsoft Azure存储资源管理器 1.4.1版本无法将消息从一个Azure队列移动到另一个Azure队列。

了一个简单的解决方案,将毒气消息传回原始队列,并认为这样做可以节省几分钟的时间。显然,您需要修复导致消息最终在有害消息队列中的错误!

您需要添加对Microsoft.NET.Sdk.Functions的NuGet包引用:

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;

void Main()
{
    const string queuename = "MyQueueName";

    string storageAccountString = "xxxxxx";

    RetryPoisonMesssages(storageAccountString, queuename);
}

private static int RetryPoisonMesssages(string storageAccountString, string queuename)
{
    CloudQueue targetqueue = GetCloudQueueRef(storageAccountString, queuename);
    CloudQueue poisonqueue = GetCloudQueueRef(storageAccountString, queuename + "-poison");

    int count = 0;
    while (true)
    {
        var msg = poisonqueue.GetMessage();
        if (msg == null)
            break;

        poisonqueue.DeleteMessage(msg);
        targetqueue.AddMessage(msg);
        count++;
    }

    return count;
}

private static CloudQueue GetCloudQueueRef(string storageAccountString, string queuename)
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageAccountString);
    CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
    CloudQueue queue = queueClient.GetQueueReference(queuename);

    return queue;
}
Run Code Online (Sandbox Code Playgroud)