调整 python 运行时 Azure Function 应用计时器触发器以实现夏令时

问题描述 投票:0回答:1

我的服务器按照启动和停止时间表运行,不幸的是,该时间表遵循夏令时。 我正在寻找一种方法来动态更改函数应用程序上的 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 方面的已知错误吗? 非常感谢任何帮助。

python cron azure-functions timer-trigger
1个回答
0
投票

@app.schedule()
中,如果设置
schedule = "0 35 * * * *"
,调度程序将按预期在每小时第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 环境中。

enter image description here

部署状态:

enter image description here

成功:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.