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

时间:2015-03-07 02:58:44

标签: azure azure-webjobs azure-queues

我有两个不同的方案来使用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();
    }

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

1 个答案:

答案 0 :(得分:1)

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

您可以遵循这些方法

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

旁边找到这样的方法
public static void ProcessQueueMessage([QueueTrigger("logqueue")] string logMessage)
{
    //do something
}

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

的方法

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

与等待队列here相关的文档。

[更新]

由于我们知道一个Web作业只能在一个队列上等待,因此在这种情况下等待队列不是正确的方法。更好地定期触发网络工作(比如5分钟一次)。将来自多个队列的消息出列并处理它们的逻辑将成为一个Web作业的一部分。处理每个队列可以是一个由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);
}