我在資料庫中有幾個表,一個用于存盤一年中的假期(HolidayWeeks)串列,另一個用于存盤設定(設定),例如應用程式何時運行。這兩個表都在 Azure DB 中如下所示


我開始構建 Timer Triggered AzureFunction 以每天早上 5 點檢查今天是否也屬于假期串列今天(星期幾)等于設定表中的訂單日,如下所示
public static class StartorStopSMAppService
{
[FunctionName("StartorStopSMAppService")]
public static void Run([TimerTrigger("0 0 5 * * *")]TimerInfo myTimer, ILogger log)
{
int holidaychk = 0;
var str = Environment.GetEnvironmentVariable("SurplusMouseDBConnection");
using (SqlConnection conn = new SqlConnection(str))
{
try
{
conn.Open();
var settingscheck = "SELECT TOP 1 [EndTime],[StartTime],[OrderDay]"
"FROM[dbo].[Settings]"
"where SUBSTRING(DATENAME(weekday, getdate() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'), 0, 4) = OrderDay";
var holidaycheck = "SELECT Count(*) FROM[dbo].[HolidayWeeks] where FORMAT(getdate(), 'yyyy-MM-dd') = [HolidateDate]";
SqlCommand cmd1 = new SqlCommand(holidaycheck, conn);
holidaychk = (Int32)cmd1.ExecuteScalar();
if (holidaychk != 0)
{
SqlCommand command = new SqlCommand(settingscheck, conn);
using (SqlDataReader reader = command.ExecuteReader())
{
reader.Read();
if (reader.HasRows)
{
var starttime = reader["StartTime"].ToString();
var endtime = reader["EndTime"].ToString();
// Not sure how to call the start API at this starttime time
}}}}
catch (Exception ex)
{
log.LogInformation(ex.Message);
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
} }}
When the both the conditions are satisfied I need to start the web service on the starttime give on the Settings table which I am storing in the var starttime = reader["StartTime"].ToString(); I understand that I can POST call the API https://docs.microsoft.com/en-us/rest/api/appservice/web-apps/start to start Web App in the App Service. But how can start the application based on starttime variable. I am kind of stuck any help is greatly appreciated
uj5u.com熱心網友回復:
一旦您的代碼確定它不是假期,并且您希望在該特定時間啟動 Web 應用程式,您可以將 a 發布scheduled message到 Azure 佇列,請參閱此。如果您撰寫 Azure 函式佇列觸發器,則在呼叫它時,它可以start為您的 WebApp呼叫REST API。
uj5u.com熱心網友回復:
它也可以與 Durable 功能一起使用。您可以按如下方式實作。
- 定時器觸發功能
public static class TimerFunction
{
[FunctionName("ScheduledStart")]
public static async Task RunScheduled([TimerTrigger("0 * * * * *")] TimerInfo timerInfo,[DurableClient] IDurableClient starter,ILogger log)
{
string functionName = "OrchestractionFunction";
string time = "26/10/2021 7:00AM";
var startTime = DateTime.Parse(time).ToUniversalTime();
string instanceId = await starter.StartNewAsync(functionName, Guid.NewGuid().ToString(), startTime);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}
}
- 使用延遲創建持久函式
`
[FunctionName("OrchestractionFunction")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
var startTime = context.GetInput<DateTime>();
Console.WriteLine(startTime);
await context.CreateTimer(startTime, CancellationToken.None);
await context.CallActivityAsync("ActivityFunction", "Jhon");
}
`
- 呼叫 Http 請求的活動函式
[FunctionName("ActivityFunction")]
public static string SayHello([ActivityTrigger] string name, ILogger log){
log.LogInformation(name);
//HttpRequest here
}
您可以擴展編排功能以呼叫多個不同的 API
uj5u.com熱心網友回復:
其他兩個答案很好,但是使用您當前的代碼,您需要做的就是檢查當前日期是否大于開始時間,然后執行請求。下面是一個使用 Flurl 來簡化請求的示例:
public static class StartorStopSMAppService {
[FunctionName("StartorStopSMAppService")]
public static void Run([TimerTrigger("0 0 5 * * *")] TimerInfo myTimer, ILogger log) {
int holidaychk = 0;
var str = Environment.GetEnvironmentVariable("SurplusMouseDBConnection");
using(SqlConnection conn = new SqlConnection(str)) {
try {
conn.Open();
var settingscheck = "SELECT TOP 1 [EndTime],[StartTime],[OrderDay]"
"FROM[dbo].[Settings]"
"where SUBSTRING(DATENAME(weekday, getdate() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'), 0, 4) = OrderDay";
var holidaycheck = "SELECT Count(*) FROM[dbo].[HolidayWeeks] where FORMAT(getdate(), 'yyyy-MM-dd') = [HolidateDate]";
SqlCommand cmd1 = new SqlCommand(holidaycheck, conn);
holidaychk = (Int32) cmd1.ExecuteScalar();
if (holidaychk != 0) {
SqlCommand command = new SqlCommand(settingscheck, conn);
using(SqlDataReader reader = command.ExecuteReader()) {
reader.Read();
if (reader.HasRows) {
var starttime = reader["StartTime"].ToString();
var endtime = reader["EndTime"].ToString();
string subscriptionId = ""; // enter this value
string resourceGroupName = ""; // enter this value
string webAppName = ""; // enter this value
string url = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{webAppName}/start?api-version=2021-02-01";
DateTime dStartTime;
DateTime.TryParse(starttime, out dStartTime);
if (DateTime.UtcNow >= dStartTime){
await url.PostAsync(); // requires Flurl.Http package
}
}
}
}
} catch (Exception ex) {
log.LogInformation(ex.Message);
} finally {
if (conn.State != ConnectionState.Closed) {
conn.Close();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338033.html
標籤:azure azure-functions azure-web-app-service azure-sql-database azure-rest-api
上一篇:在AKS群集上公開非HTTP流量
