我的服务器按照启动和停止时间表运行,不幸的是,该时间表遵循夏令时。 我正在寻找一种方法来动态更改函数应用程序上的 CRON 计划以考虑夏令时。 这在 python 代码中很容易实现;但是,当您将文字字符串以外的任何内容设置为
schedule
的 azure.functions.FunctionApp.schedule()
参数时,函数应用计时器触发器将不起作用。
import azure.functions as func
import logging
app = func.FunctionApp()
@app.schedule(
schedule="<cron_schedule>"
,arg_name="myTimer"
,run_on_startup=False
,use_monitor=True
)
def timer_trigger(myTimer: func.TimerRequest) -> None:
if myTimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function executed.')
例如,在
@app.schedule()
中,如果设置 schedule = "0 35 * * * *"
,调度程序将按预期在每小时第 35 分钟触发。 验证文字字符串是否有效后,我尝试了以下允许动态输入的方法:
schedule=f"0 {35} * * * *"
var_cron = "0 35 * * * *"
schedule=var_cron
schedule="0 {minutes} * * * *".format(minutes=35)
尽管诊断中心中的计时器触发问题分析应用程序见解将所有这些方法的 CRON 显示为
0 35 * * * *
,但该应用程序实际上并未触发。 在 Azure 门户中手动运行应用程序不会返回任何错误。 此外,诊断视图“未触发的功能”不会返回任何错误。 从我想检查的每个角度来看,Azure 似乎都能理解传递到 schedule
的 @app.schedule()
参数中的内容。 您是否可以考虑尝试另一种 python 方法? 这是 Azure 方面的已知错误吗? 非常感谢任何帮助。
在
中,如果设置@app.schedule()
,调度程序将按预期在每小时第35分钟触发。验证文字字符串有效后schedule = "0 35 * * * *"
使用
@app.schedule
装饰器。 schedule
参数必须是文字字符串。这意味着动态输入(例如变量或函数)不能直接用于计划。
Azure Functions 运行时需要静态计划才能正确配置计时器。这可能是导致上述问题的原因。
这是使用
@app.schedule
装饰器修改后的现有函数应用程序代码。
import datetime
import logging
import pytz # Make sure to install pytz if you haven't already
import azure.functions as func
app = func.FunctionApp()
def is_dst(date):
"""Check if the given date is in Daylight Saving Time."""
tz = pytz.timezone("America/Chicago") # Change to your desired timezone
# Ensure the date is naive before localizing
naive_date = date.replace(tzinfo=None) # Remove tzinfo to make it naive
localized_date = tz.localize(naive_date)
return bool(localized_date.dst().seconds)
@app.schedule(
schedule="0 */1 * * * *", # Change this to your desired CRON schedule
arg_name="myTimer",
run_on_startup=False,
use_monitor=True
)
def timer_trigger(myTimer: func.TimerRequest) -> None:
# Get the current time in the specified timezone
tz = pytz.timezone("America/Chicago") # Change to your desired timezone
current_time = datetime.datetime.now(tz)
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
if myTimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
# Check if it's currently DST
if is_dst(current_time):
logging.info('Current time is in Daylight Saving Time.')
# Add your logic for DST here
else:
logging.info('Current time is in Standard Time.')
# Add your logic for Standard Time here
# Log the current local time
logging.info('Current local time is %s', current_time.isoformat())
pytz
库是否已安装在您的 Azure Function 环境中。部署状态:
成功: