我正在开发一个Azure WebJobs可执行文件,我想与多个Azure网站一起使用。每个网站都需要自己的Azure存储队列。
我看到的问题是ProcessQueueMessage
要求将队列名称静态定义为第一个参数inputText
的属性。我宁愿让队列名称成为正在运行的Azure网站实例的配置属性,并且在启动时在运行时读取作业可执行文件。
有没有办法做到这一点?
答案 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构造函数来支持此功能。
答案 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,但您可以为队列执行非常类似的操作。