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可以用的吗?
Webjob启动时可以禁用触发功能.
您可以查看此问题:动态启用/禁用功能.
所以Webjob SDK提供了一个DisableAttribute`:
[Disable("setting")] - 如果指定的设置名称存在配置/环境值,并且其值为"1"或"True"(不区分大小写),则将禁用该功能.[Disable(typeof(DisableProvider))] - 自定义类型声明签名bool IsDisabled(MethodInfo方法)的函数.我们将调用此方法来确定是否应禁用该函数.在您的情况下,您需要使用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它旨在将依赖项注入到您的函数中.你可以看一下这些与以下相关的帖子: