【问题标题】:How to set Azure WebJob queue name at runtime?如何在运行时设置 Azure WebJob 队列名称?
【发布时间】:2020-05-07 21:02:25
【问题描述】:

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

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

有什么办法吗?

【问题讨论】:

    标签: azure-webjobs


    【解决方案1】:

    现在可以完成了。只需创建一个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();
    

    【讨论】:

    • @eklein23 您能否将此答案标记为“答案” :) 谢谢。
    • 最新版本SDK中默认的JobHostConfiguration自动包含一个NameResolver,所以不用自己定义了,直接使用%configkey%就可以了。
    • @viblo 你能提供一个参考吗? WebJobs 3.x 仍然是这种情况吗?
    • @ScottH 我不知道最新的 3.x sdk 的状态如何,我还没有升级。似乎他们改变了很多东西:github.com/Azure/azure-webjobs-sdk/issues/1870
    • 但是,这不是在运行时设置的;配置是在运行前定义的,因此尽管这是流行的答案,但它没有回答“如何在运行时设置队列名称(任意字符串)?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      名称解析器的一个更好的实现,以避免一直从配置中获取。它使用Dictionary 来存储检索到的配置值。

      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];
          }
      }
      

      【讨论】:

        【解决方案4】:

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

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

        Here isIBinder 的样本。该示例动态绑定 blob,但您可以对队列执行非常类似的操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多