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

Mar*_*kin 4 c# azure azure-webjobs azure-webjobssdk

我们有一个azure web作业,在functions.cs文件中有两个方法.这两个作业都是从Azure Service Bus中的不同主题触发的.

由于它在运行时使用反射来确定由命中主题的消息运行/触发的函数,因此代码中没有对这些方法的引用.

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) {}
Run Code Online (Sandbox Code Playgroud)

基于运行时设置的变量,我需要让这个Web作业同时运行这两种方法,或者只运行其中一种方法(它不会更改作业正在运行的一个,但是在作业启动时读入它) .我不能简单地将方法的内部包装在if()基于变量的内容中,因为它会读取并销毁消息.

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

Tho*_*mas 9

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

您可以查看此问题:动态启用/禁用功能.

所以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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您的函数应该使用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) {}
Run Code Online (Sandbox Code Playgroud)

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

  • 仍然支持吗?我在Microsoft.NET.Sdk.Functions.Build.targets中收到错误消息“不支持构造函数'DisableAttribute(Type)'”。我使用功能v2。 (2认同)