在 Azure WebJob 中动态启用/禁用触发函数

Dynamically enable/ disable a triggered function in Azure WebJob

我们有一个 Azure Web 作业,在 Functions.cs 文件中有两个方法。这两个作业都是由 Azure 服务总线中的不同主题触发的。

由于这在 运行 时间使用反射来确定命中主题的消息要 run/triggered 的功能,因此代码中没有对这些方法的引用。

public static async Task DoWork([ServiceBusTrigger("topic-one", "%environmentVar%")] BrokeredMessage brokeredMessage, TextWriter log) {}

public static async Task DoOtherWork([ServiceBusTrigger("topic-two", "%environmentVar2%")] BrokeredMessage brokeredMessage, TextWriter log) {}

我需要根据在 运行 时间设置的变量(它不会改变一个作业)运行 两种方法或其中一种是 运行ning,但它是在作业开始时读入的)。我不能简单地将方法的内部结构包装在基于变量的 if() 中,因为那样会读取并破坏消息。

是否可以使用 JobHostConfiguration(一个 IServiceProvider)来实现此目的,因为它是在 运行 时构建的。那是JobHostConfiguration.IJobActivator可以用来做什么?

Webjob 启动时可以禁用触发函数。

你可以看看这个问题:Dynamic Enable/ Disable a function.

所以Webjob SDK提供了一个DisableAttribute`:

  • 可以在 Parameter/Method/Class 级别应用
  • 只影响触发函数
  • [Disable("setting")] - 如果指定的设置名称存在 config/environment 值,并且其值为“1”或 "True"(不区分大小写),则该功能将被禁用。
  • [Disable(typeof(DisableProvider))] - 声明签名 bool IsDisabled(MethodInfo 方法) 函数的自定义类型。我们将调用此方法来确定是否应禁用该功能。
  • 这只是启动时间检查。对于禁用的触发函数,我们只需跳过函数侦听器的启动。但是,当您更新绑定到这些属性的应用程序设置时,您的 WebJob 将自动重启并且您的设置将生效。
  • 设置名称可以包含绑定参数(例如 {MethodName}、{MethodShortName}、%test% 等)

在您的情况下,您需要将 DisableAttribute 与 DisableProvider 结合使用。

public class DoWorkDisableProvider
{
    public bool IsDisabled(MethodInfo method)
    {
        // check if the function should be disable
        // return true or false

        return true;
    }
}

public class DoOtherWorkkDisableProvider
{
    public bool IsDisabled(MethodInfo method)
    {
        // check if the function should be disable
        // return true or false

        return true;
    }
}

你的函数应该用 disable 属性修饰

[Disable(typeof(DoWorkDisableProvider))]
public static async Task DoWork([ServiceBusTrigger("topic-one", "%environmentVar%")] BrokeredMessage brokeredMessage, TextWriter log) {}

[Disable(typeof(DoOtherWorkkDisableProvider))]
public static async Task DoOtherWork([ServiceBusTrigger("topic-two", "%environmentVar2%")] BrokeredMessage brokeredMessage, TextWriter log) {}

否则 JobHostConfiguration.IJobActivator 旨在将依赖项注入您的函数。你可以看看这些与以下相关的帖子: