在 Azure WebJob 中动态启用/禁用触发功能

Posted

技术标签:

【中文标题】在 Azure WebJob 中动态启用/禁用触发功能【英文标题】:Dynamically enable/ disable a triggered function in Azure WebJob 【发布时间】:2018-01-19 00:41:26 【问题描述】:

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

由于这在运行时使用反射来确定要运行/触发的函数,因此代码中没有对这些方法的引用。

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) 

我需要让这个 Web 作业运行两种方法,或者只运行其中一种方法,基于运行时设置的变量(它不会改变正在运行的作业,但是当工作开始)。我不能简单地将方法的内部结构包装在基于变量的if() 中,因为那样会读取并销毁消息。

是否可以使用JobHostConfigurationIServiceProvider)来实现这一点,因为它是在运行时构建的。那是JobHostConfiguration.IJobActivator可以用的吗?

【问题讨论】:

【参考方案1】:

可以在 Webjob 启动时禁用触发功能。

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

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

可以在参数/方法/类级别应用 仅影响触发函数 [Disable("setting")] - 如果指定设置名称的配置/环境值存在,并且其值为“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 旨在将依赖项注入您的函数。您可以查看与以下相关的帖子:

Dependency injection using Azure WebJobs SDK? Azure Triggered Webjobs Scope for Dependency Injection

【讨论】:

完美@Thomas 谢谢!看起来我用 IJobActivator 找错树了 这还支持吗?我在 Microsoft.NET.Sdk.Functions.Build.targets 中收到错误“不支持构造函数 'DisableAttribute(Type)'”。我使用 Functions v2。 是的,但它不是 Microsoft.NET.Sdk.Functions.Build.targets 命名空间的一部分……它是 azure webjob sdk 的一部分 你不能评论 run.cmd 的工作吗?通过在命令前添加 REM。像 REM dotnet WebJobAssemblyName.dll。

以上是关于在 Azure WebJob 中动态启用/禁用触发功能的主要内容,如果未能解决你的问题,请参考以下文章

Azure 触发的 Webjob - 检测 webjob 何时停止

如何在不删除的情况下暂停 azure webjob?

使 Azure Webjob 计时器触发器不作为单例运行

Azure webjob 似乎不尊重 MaxDequeueCount 属性

取消单个 WebJob 执行

Laravel 队列和 Azure WebJob