定时器触发器不会触发队列但手动输入会-Python

问题描述

我有一个队列触发器,当将消息手动添加到队列中时,它会按预期启动并运行。但是,当消息被以下定时器触发函数写入队列时,它无法启动。我可以看到消息被触发器成功写入。

** init.py**

import datetime
import logging
import os,uuid
from azure.storage.queue import (
        QueueClient,BinaryBase64EncodePolicy,BinaryBase64DecodePolicy
)

import os,uuid
import azure.functions as func


def main(mytimer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcNow().replace(
        tzinfo=datetime.timezone.utc).isoformat()
    conn_str = os.environ['AzureWebJobsstorage']

    queue_name="outqueue12"
    
    message = u"Hello234"
    queue_client = QueueClient.from_connection_string(conn_str,queue_name)
    # Setup Base64 encoding and decoding functions
    queue_client.message_encode_policy = BinaryBase64EncodePolicy()
    queue_client.message_decode_policy = BinaryBase64DecodePolicy()
    
    queue_client.send_message(message)
    
           
    logging.info('Python timer trigger function ran at %s',utc_timestamp)

host.json

{
  "version": "2.0","logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,"excludedTypes": "Request"
      }
    }
  },"extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle","version": "[1.*,2.0.0)"
  }
}

有什么我遗漏的吗?

解决方法

根据一些测试,问题与base64编码有关。我添加了三行代码:

message_bytes = message.encode('ascii')
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode('ascii')

请参考下面的完整功能代码: enter image description here

host.json

{
  "version": "2.0","logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,"excludedTypes": "Request"
      }
    }
  },"extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle","version": "[1.*,2.0.0)"
  }
}

function.json

{
  "scriptFile": "__init__.py","bindings": [
    {
      "name": "mytimer","type": "timerTrigger","direction": "in","schedule": "*/20 * * * * *"
    }
  ]
}
,

如果您不想使用 base64 编码(我个人不建议这样做),那么设置策略没有意义,只需删除以下几行,您的原始代码应该可以工作:

    # Setup Base64 encoding and decoding functions
    queue_client.message_encode_policy = BinaryBase64EncodePolicy()
    queue_client.message_decode_policy = BinaryBase64DecodePolicy()

See example 来自文档。