QueueOperations

public static class QueueOperations
{
[FunctionName(“Support_ReprocessPoisonQueueMessages”)]
public static async Task Support_ReprocessPoisonQueueMessages([HttpTrigger(AuthorizationLevel.Admin, “put”, Route = “support/reprocessQueueMessages/{queueName}”)]HttpRequest req, ILogger log,
[Queue("{queueName}")] CloudQueue queue,
[Queue("{queueName}-poison")] CloudQueue poisonQueue, string queueName)
{
log.LogInformation(“Support_ReprocessPoisonQueueMessages function processed a request.”);

    int.TryParse(req.Query["messageCount"], out var messageCountParameter);
    var messageCount = messageCountParameter == 0 ? 10 : messageCountParameter;

    var processedMessages = 0;
    while (processedMessages < messageCount)
    {
        var message = await poisonQueue.GetMessageAsync();
        if (message == null)
            break;

        var messageId = message.Id;
        var popReceipt = message.PopReceipt;

        await queue.AddMessageAsync(message); // a new Id and PopReceipt is assigned
        await poisonQueue.DeleteMessageAsync(messageId, popReceipt);
        processedMessages++;
    }

    return new OkObjectResult($"Reprocessed {processedMessages} messages from the {poisonQueue.Name} queue.");
}

}

// Prompt the user for the connection string
Console.WriteLine(“Enter the connection string for the Azure storage account:”);
var connectionString = Console.ReadLine();

    // Prompt the user for the queue name
    Console.WriteLine("Enter the name of the Azure Queue to unpoison:");
    var queueName = Console.ReadLine();

    if (!string.IsNullOrWhiteSpace(connectionString) && !string.IsNullOrWhiteSpace(queueName))
    {
        // setup the connection to table storage
        CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(connectionString);
        CloudQueueClient queueClient = cloudStorageAccount.CreateCloudQueueClient();
        CloudQueue poisonQueue = queueClient.GetQueueReference(queueName + "-poison");
        CloudQueue regularQueue = queueClient.GetQueueReference(queueName);

        CloudQueueMessage retrievedMessage = poisonQueue.GetMessage();

        while (retrievedMessage != null)
        {
            // delete the message from the poison queue
            poisonQueue.DeleteMessage(retrievedMessage);
            // queue up a new message on the original queue
            regularQueue.AddMessage(retrievedMessage);
            Console.WriteLine("Moved over message from poison queue: " + retrievedMessage.AsString);

            // Get the next message for processing
            retrievedMessage = poisonQueue.GetMessage();
        }
    }
    else
    {
        Console.WriteLine("Unable to proceed without the connection string and queue name.");
    }

public static class MonitorPoisonQueues
{
private static readonly TelemetryClient TelemetryClient = new TelemetryClient();

private static string key = TelemetryConfiguration.Active.InstrumentationKey 
  	= Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", 
                                         EnvironmentVariableTarget.Process);

[FunctionName("MonitorPoisonQueues")]
public static async Task Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, TraceWriter log)
{
    var queuesToMonitor = new List<CloudQueue>();

    var queueStorageConnectionString = ConfigurationManager.AppSettings["MonitorQueueStorage"];
    var account = CloudStorageAccount.Parse(queueStorageConnectionString);
    var queueClient = account.CreateCloudQueueClient();

    QueueContinuationToken continuationToken = null;

    do
    {
        var segment = await queueClient.ListQueuesSegmentedAsync(continuationToken);
        var poisonQueues = segment.Results.Where(
          		q => q.Name.EndsWith("-poison", StringComparison.InvariantCultureIgnoreCase));
        queuesToMonitor.AddRange(poisonQueues);
        
        continuationToken = segment.ContinuationToken;
    }
    while (continuationToken != null);
    
    foreach (var queue in queuesToMonitor)
    {
        await queue.FetchAttributesAsync();
        var queueLength = queue.ApproximateMessageCount;

        TelemetryClient.TrackMetric($"Poisonqueue length - {queue.Name}", (double)queueLength);
        log.Info($"Queue: {queue.Name} (Items: {queueLength})");
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值