为暂存和生产配置 Azure WebJobs

Configure Azure WebJobs for Staging and Production

我有一个作为 Azure 网站托管的 Web 应用程序 (ASP.NET MVC 4)。它还有另外两个组件,一个 Worker Role 和一个 Web Job。

工作者角色对应用程序中的数据/activity 进行一些嗅探,并通过 Azure 存储队列对 Web 作业的工作进行排队,基于我认为是标准模式。下面的代码片段:

public class Functions
{
    // This function will get triggered/executed when a new message is written 
    // on an Azure Queue called queue.
    public static void NewBidsQueue([QueueTrigger("bids")] string message, TextWriter log)
    {
        log.WriteLine(message);
    }

    public static void SendText([QueueTrigger("texts")] string message, TextWriter log)
    {
        log.WriteLine(message);
    }

    public static void AuctionEvents([QueueTrigger("auction-events")] string message, TextWriter log)
    {
        log.WriteLine(message);
    }
}

由于队列是函数定义的一部分,除了拥有单独的存储帐户之外,还有其他方法可以在队列触发器中切换队列名称吗?

我设计了一些棘手的解决方法。我正在使用预处理器指令来换出字符串常量:

public static class WebJobStorageQueueNames 
{
#if DEBUG
    public const string AuctionEvents = "auction-events-test";
    public const string Texts = "texts-test";
    public const string Bids = "bids-test";
#else
    public const string AuctionEvents = "auction-events";
    public const string Texts = "texts";
    public const string Bids = "bids";
#endif
}

以及附带的函数定义:

public class Functions 
{
    public static void NewBidsQueue([QueueTrigger(WebJobStorageQueueNames.Bids)] string message, TextWriter log)
    {
        log.WriteLine(message);
    }

    public static void SendText([QueueTrigger(WebJobStorageQueueNames.Texts)] string message, TextWriter log)
    {
        log.WriteLine(message);
    }

    public static void AuctionEvents([QueueTrigger(WebJobStorageQueueNames.AuctionEvents)] string message, TextWriter log)
    {
        log.WriteLine(message);
    }

}

您可以通过实施 INameResolver 动态解析队列名称。

举个例子。队列名称解析器

public class QueueNameResolver : INameResolver
{
    public string Resolve(string name)
    {
        //The name comes from the function in the WebJob
        if (name == "queueKey")
        {
            return "yourqueuename";
        }
        if (name == "queueKeyPoison")
        {
            return "yourqueuename-poison";
        }
        return String.Empty;
    }
}

您需要在配置 webjob 时指定名称解析器:

    private static void Main(string[] args)
    {
        var config =
            new JobHostConfiguration("your connection string")
            {
                NameResolver = new QueueNameResolver()
            };
        var host = new JobHost(config);

        host.RunAndBlock();
    }
    public static void NewBidsQueue([QueueTrigger(%queueKey%)] string message, TextWriter log)
    {
        log.WriteLine(message);
    }

解析器接收参数"queueKey",您可以根据该参数决定应该使用什么队列名称。

有更多信息here.

希望这对您有所帮助,