如何在没有队列触发器的情况下在Azure函数中读取Azure队列

axzmvihb  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(142)

如果我有一个为队列生成数据的Azure函数,它非常简单:我只是将它设置为函数的一个参数:
[Queue("myQueue")] ICollector<MyType> myQueue
是否有任何类似的方法可以从队列中读取数据?我可以找到的所有关于从Azure Functions中的队列阅读的信息都是关于队列触发器的,这不是我想要做的;我想要一个定时器触发的函数,它将批处理队列中的元素。我如何在我的函数中获得一个“队列读取器”?

b1zrtrql

b1zrtrql1#

听起来你想要一个出队进程而不是一个触发进程。试试微软文档中演示的这个例子。
https://learn.microsoft.com/en-us/azure/storage/queues/storage-tutorial-queues?tabs=dotnet%2Cenvironment-variable-windows#dequeue-messages
摘录如下

static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue){
if (await theQueue.ExistsAsync())
{
    QueueProperties properties = await theQueue.GetPropertiesAsync();

    if (properties.ApproximateMessagesCount > 0)
    {
        QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
        string theMessage = retrievedMessage[0].Body.ToString();
        await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
        return theMessage;
    }

    return null;
}

return null;
}

看起来你也可以调整最大批量大小。

t0ybt7op

t0ybt7op2#

我读你的问题,好像你需要一个timer triggered fuction,以采取消息(出队)的队列。
因此,您需要创建一个计时器触发函数,如下所示:

[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
{
    DequeueMessage("nyConnection");
}

然后调用dequeue的函数,从docs获取队列中的消息

public void DequeueMessage(string queueName)
{
    // Get the connection string from app settings
    string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

    // Instantiate a QueueClient which will be used to manipulate the queue
    QueueClient queueClient = new QueueClient(connectionString, queueName);

    if (queueClient.Exists())
    {
        // Get the next message
        QueueMessage[] retrievedMessage = queueClient.ReceiveMessages();

        // Process (i.e. print) the message in less than 30 seconds
        Console.WriteLine($"Dequeued message: '{retrievedMessage[0].Body}'");

        // Delete the message
        queueClient.DeleteMessage(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
    }
}

相关问题