在 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()
中,因为那样会读取并销毁消息。
是否可以使用JobHostConfiguration
(IServiceProvider
)来实现这一点,因为它是在运行时构建的。那是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
旨在将依赖项注入您的函数。您可以查看与以下相关的帖子:
【讨论】:
完美@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 何时停止