如何在运行时设置Azure WebJob队列名称?

时间:2014-03-28 19:24:23

标签: azure-webjobs

我正在开发一个Azure WebJobs可执行文件,我想与多个Azure网站一起使用。每个网站都需要自己的Azure存储队列。

我看到的问题是ProcessQueueMessage要求将队列名称静态定义为第一个参数inputText的属性。我宁愿让队列名称成为正在运行的Azure网站实例的配置属性,并且在启动时在运行时读取作业可执行文件。

有没有办法做到这一点?

4 个答案:

答案 0 :(得分:93)

现在可以这样做了。只需创建一个INameResolver,即可解析%(百分号)符号所包围的任何字符串。例如,如果这是您指定了队列名称的函数:

public static void WriteLog([QueueTrigger("%logqueue%")] string logMessage)
{
    Console.WriteLine(logMessage);
}

注意字符串logqueue周围有%(百分比)符号。这意味着作业系统将尝试使用您可以创建的INameResolver来解析名称,然后在您的工作中注册。

这是一个解析器的示例,它只会获取百分号中指定的字符串,并在配置文件的AppSettings中查找:

public class QueueNameResolver : INameResolver
{
    public string Resolve(string name)
    {
        return ConfigurationManager.AppSettings[name].ToString();
    }
}

然后在你的Program.cs文件中,你只需要连接它:

var host = new JobHost(new JobHostConfiguration
{
  NameResolver = new QueueNameResolver()
});
host.RunAndBlock();

答案 1 :(得分:2)

这可能是一个老问题,但万一其他人偶然发现这篇文章。现在通过将JobHostConfiguration对象传递给JobHost构造函数来支持此功能。

http://azure.microsoft.com/en-gb/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues-how-to/#config

答案 2 :(得分:0)

稍微好一点的名称解析器实现,以避免一直从配置中获取。一旦检索到,就使用字典来存储配置值。

using Microsoft.Azure.WebJobs;
using System.Collections.Generic;
using System.Configuration;

public class QueueNameResolver : INameResolver
{
    private static Dictionary<string, string> keys = new Dictionary<string, string>();
    public string Resolve(string name)
    {
        if (!keys.ContainsKey(name))
        {
            keys.Add(name, ConfigurationManager.AppSettings[name].ToString());
        }
        return keys[name];
    }
}

答案 3 :(得分:-1)

不幸的是,这是不可能的。您可以使用IBinder接口动态绑定到队列,但是您没有触发机制。

基本上,如果需要触发器,则必须对输入队列名称进行硬编码。对于输出,您可以使用前面提到的接口。

Here is IBinder的示例。该示例动态绑定blob,但您可以为队列执行非常类似的操作。