为暂存和生产配置 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.
希望这对您有所帮助,
我有一个作为 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.
希望这对您有所帮助,