在 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
旨在将依赖项注入您的函数。你可以看看这些与以下相关的帖子:
我们有一个 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
旨在将依赖项注入您的函数。你可以看看这些与以下相关的帖子: