【问题标题】:How to read the CRON expression from appsettings.json at runtime?如何在运行时从 appsettings.json 读取 CRON 表达式?
【发布时间】:2019-02-19 06:31:26
【问题描述】:

我开发了具有多个计时器触发功能的网络作业项目。每个功能在一天中的不同时间执行。有些是每分钟执行一次,有些是每五分钟执行一次,有些是一天执行一次。

如果我在函数参数属性本身中编写 CRON 表达式,例如
ProcessTrigger2([TimerTrigger("0 */3 * * * *", RunOnStartup = false)]TimerInfo timerInfo),它会按预期工作,但是当我尝试从 appsettings.json 读取时它会失败。

谁能提出正确的阅读 Functions.cs 中 appsettings.json 的方法??

以下是我正在尝试的代码。

程序.cs

internal class Program
   {
        // Please set the following connection strings in app.config for this WebJob to run:
        // AzureWebJobsDashboard and AzureWebJobsStorage
        private static void Main()
        {
            ServiceCollection services = new ServiceCollection();
            ConfigureServices(services);

            var config = new JobHostConfiguration();
            config.JobActivator = new JobActivator(services.BuildServiceProvider());
            config.UseTimers();

            if (config.IsDevelopment)
            {
                config.UseDevelopmentSettings();
            }

            var host = new JobHost(config);
            // The following code ensures that the WebJob will be running continuously
            host.RunAndBlock();
        }

        private static IConfiguration Configuration { get; set; }

        private static void ConfigureServices(IServiceCollection services)
        {
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            services.AddSingleton(Configuration);
            services.AddTransient<Functions, Functions>();
            services.AddLogging(builder => builder.AddConsole());
        }
    }

函数.cs

public class Functions
    {
        private readonly ILogger<Functions> logger;

        private readonly IConfiguration configuration;

        public Functions(ILogger<Functions> logger, IConfiguration configuration)
        {
            this.configuration = configuration;
            this.logger = logger;
        }


        [FunctionName("TimerTriggerEveryMinute")]
        public void ProcessTrigger1([TimerTrigger("%TimerTriggerEveryMinute:Schedule%")]TimerInfo timerInfo)
        {
            var ab = this.configuration;
            Console.WriteLine(string.Format("{0} Proc 1",DateTime.Now));
        }

        [FunctionName("TimerTriggerEveryThirdMinute")]
        public void ProcessTrigger2([TimerTrigger("0 */3 * * * *", RunOnStartup = false)]TimerInfo timerInfo)
        {
            Console.WriteLine(string.Format("{0} Proc 2",DateTime.Now));
        }

        [FunctionName("TimerTriggerEveryFiveMinute")]
        public void ProcessTrigger3([TimerTrigger("%EveryFiveMinuteSchedule%",RunOnStartup =false)]TimerInfo timer)
        {
            Console.WriteLine(string.Format("{0} Proc 5", DateTime.Now));
        }
}

JobActivator.cs

 public class JobActivator : IJobActivator
    {
        private readonly IServiceProvider services;

        public JobActivator(IServiceProvider services)
        {
            this.services = services;
        }

        public T CreateInstance<T>()
        {
            return services.GetService<T>();
        }
    }

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "AzureWebJobsDashboard": "My Azure Dashboard key here...",
    "AzureWebJobsStorage": "My Azure Job Storage key here...",
  },
  "TimerTriggerEveryMinute": {
    "Schedule": "0 * * * * *"
  },
  "TimerTriggerEveryFiveMinute": {
    "Schedule": "0 */5 * * * *"
  }
}

在上面的代码中,在 Functions.cs 中,如果我在
ProcessTrigger2([TimerTrigger("0 */3 * * * *", RunOnStartup = false)]TimerInfo timerInfo) 中以这种方式为所有方法编写计时器触发器,则作业按预期工作,但如果我以其他两种方式编写,则会出现异常。 请提出从 appsettings.json 读取日程的写法。

【问题讨论】:

    标签: azure azure-webjobs timer-trigger


    【解决方案1】:

    是的。不要对 CRON 表达式进行硬编码,而是将表达式放在应用程序设置中并使用 % 符号引用它。例如,如果您有一个名为 CRON_EXPRESSION 的设置:

    public static void Run([TimerTrigger("%CRON_EXPRESSION%")]TimerInfo myTimer, TraceWriter log)

    参考 - https://github.com/Azure/azure-functions-host/issues/1934

    【讨论】:

    • 谢谢达什琳。但是如果你能看到上面的代码,我已经尝试了你建议的相同方法。它对我不起作用。难道我做错了什么?我的项目中没有function.json。需要添加function.json文件吗?
    • 是的,请添加 function.json 文件并指定绑定,例如 { "scriptFile": "test.js", "bindings": [ { "type": "timerTrigger", "direction": "in", "schedule": "0 0 */5 * * *" } ] } json.schemastore.org/function
    • 官方doku哪里写的,那我就瞎加个这样的function.json?
    猜你喜欢
    • 2018-08-20
    • 2014-05-23
    • 1970-01-01
    • 2017-07-21
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多