使用Azure队列存储为每个队列配置QueueTrigger

jac*_*per 5 azure azure-queues azure-webjobs

我有两个不同的场景,使用Azure队列存储处理2种不同类型的队列.

我想设置一个接一个地运行的队列,另一个同时运行.

我一直在查看文档,我可以将配置应用于影响整个队列范围的主机.

static void Main(string[] args)
    {
        JobHostConfiguration config = new JobHostConfiguration();
        config.Queues.BatchSize = 8;
        config.Queues.MaxDequeueCount = 4;
        config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(15);
        JobHost host = new JobHost(config);
        host.RunAndBlock();
    }
Run Code Online (Sandbox Code Playgroud)

那么我可以使用单个azure存储帐户配置这些方案吗?

Ami*_*mit 1

从您的问题中,我了解到您有 2 个队列,每个队列需要用于处理不同的任务/作业。

您可以遵循这些方法

1)部署2个Web作业,每个作业在不同的队列上等待,并在各自的队列上出现消息时触发相应的作业。您上面提到的配置代码为一项作业设置了基础。AFAIK,一项工作可以在一个队列上等待。Main()你可以在方法旁边有一个像这样的方法

public static void ProcessQueueMessage([QueueTrigger("logqueue")] string logMessage)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

2)如果你想根据一个队列中的消息触发多个场景,你可以在方法上有一个 if else 块ProcessQueueMessage,或者如果你想让它更易于管理,请使用策略模式来执行正确的方法ProcessQueueMessage

如果您遵循上面的#1,您将为每个任务/作业/场景部署不同的 Web 作业。如果您遵循上面的#2,您将部署一个 Web 作业,并且每条消息的作用是在处理消息时决定的。

与排队等待相关的文档请参见此处

[更新]

我们知道一个 Web 作业只能等待一个队列,在这种情况下,等待队列并不是正确的方法。最好定期触发网络作业(比如每 5 分钟触发一次)。从多个队列中取出消息并对其进行处理的逻辑将成为一项 Web 作业的一部分。处理每个队列可以是由网络同一作业调用的方法(依次使用或同时使用Task)。CloudQueue.GetMessages您可以传递每个队列的消息计数。它与 Windows 服务的作用非常相似。只是触发部分由 Web 作业负责,并且它作为 Web 作业而不是 Windows 服务运行。这是一个粗略的伪代码:

main()
{
  // initialize webjob
}
public static MyWebJobMethod(...)
{
    Task a = () => {//process queue 1};
    Task b = () => {//process queue 2}
    Task.WaitAll(a,b);
}
Run Code Online (Sandbox Code Playgroud)