用户从界面输入CRON表达式。功能应用程序应更新应用程序设置以反映用户输入。
我目前的做法
具有schedule
应用设置的TimerTrigger函数
[FunctionName("Cleanup")]
public static async Task Run([TimerTrigger("%schedule%")]TimerInfo myTimer, ILogger log)
{
// Get the connection string from app settings and use it to create a connection.
var str = Environment.GetEnvironmentVariable("db_connection");
log.LogInformation($"db_connection : {str}");
}
通过环境变量设置schedule
应用设置
[FunctionName("SetConfig")]
public static async Task<HttpResponseMessage> SetConfig([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req)
{
HistoryLogDeleteConfigDto data = await req.Content.ReadAsAsync<HistoryLogDeleteConfigDto>();
Environment.SetEnvironmentVariable("schedule", data.Schedule);
return req.CreateResponse(HttpStatusCode.OK);
}
local.settings.json文件
"Values": {
"db_connection": "Server=DESKTOP-DFJ3PBT;Database=CovalentLogger;Trusted_Connection=True;MultipleActiveResultSets=true",
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"schedule": "*/20 * * * * *"
}
POSTMAN请求正文以更新schedule
应用设置
{
"Schedule": "*/30 * * * * *"
}
但是没有运气。从邮递员发送更新设置的请求后,如果我访问azure门户功能应用程序设置,我仍然可以看到旧值。
但是如果我查询environmnet变量,如下所示
Environment.GetEnvironmentVariable("schedule", EnvironmentVariableTarget.Process)
我可以看到新的表达方式。但是在Azure门户功能appsetting中,它仍然是旧值。因此,作业仍会按照旧的时间表执行。
我哪里出错了? 谢谢
答案 0 :(得分:1)
我认为像这样更新环境变量不会起作用,因为仅在函数初始化时或在应用程序服务上更新应用程序设置时才读取时间表。但是,它仍然应该可行。这基本上可以满足您的需求:https://stackoverflow.com/a/50116234/1537195
只需将其打包到您的HTTP触发函数中(我可能会使用Managed Identity),您就可以使用了。