Azure函数 - Python - ServiceBus输出绑定 - 设置自定义属性

时间:2017-10-10 01:10:21

标签: python azure azure-functions azureservicebus

我有一个用Python编写的Azure函数,它具有Service Bus(Topic)输出绑定。该函数由另一个队列触发,我们处理blobl存储中的一些文件,然后将另一条消息放入队列中。

我的function.json文件看起来像这样:

{
"bindings": [
    {
    "type": "serviceBus",
    "connection": "Omnibus_Input_Send_Servicebus",
    "name": "outputMessage",
    "queueName": "validation-output-queue",
    "accessRights": "send",
    "direction": "out"
    }
],
"disabled": false
}

在我的函数中,我可以将消息发送到另一个队列:

with open(os.environ['outputMessage'], 'w') as output_message:
    output_message.write('This is my output test message !')

工作正常。现在我想向主题发送消息。我使用SQLFilter创建了订阅,我需要为BrokeredMessage设置一些自定义属性。

azure sdk for python,我发现我可以添加这样的自定义属性(我已经使用pip安装了azure模块):

from azure.servicebus import Message
sent_msg = Message(b'This is the third message',
    broker_properties={'Label': 'M3'},
    custom_properties={'Priority': 'Medium',
                        'Customer': 'ABC'}
)

我的新function.json文件看起来像这样:

{
"bindings": [
    {
    "type": "serviceBus",
    "connection": "Omnibus_Input_Send_Servicebus",
    "name": "outputMessage",
    "topicName": "validation-output-topic",
    "accessRights": "send",
    "direction": "out"
    }
],
"disabled": false
}

我修改了我的功能:

from azure.servicebus import Message
sent_msg = Message(b'This is the third message',
    broker_properties={'Label': 'M3'},
    custom_properties={'Priority': 'Medium',
                        'Customer': 'ABC'}
)

with open(os.environ['outputMessage'], 'w') as output_message:
    output_message.write(sent_msg)

当我运行该函数时,我得到了这个例外:

  

TypeError:期望字符串或其他字符缓冲区对象

我尝试使用buffermemoryview函数,但仍然有另一个例外:

  

TypeError:无法进行内存查看,因为对象没有缓冲区接口

我想知道实际绑定是否支持BrokeredMessage以及如何处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

Python(和其他脚本语言)的ServiceBus输出绑定仅支持简单的字符串映射,其中您指定的字符串将成为幕后创建的BrokeredMessage的内容。要设置任何扩展属性或执行更复杂的操作,您必须自己在功能中自行使用Azure Python SDK。

答案 1 :(得分:0)

在相同的情况下,我需要在输出服务总线队列/主题中添加用户属性,我直接使用了azure.servicebus.ServiceBusClient。

sb.Message 类具有 user_properties 设置器:

def main(
    httpreq: func.HttpRequest,
    context: func.Context  ):

sbClient : sb.ServiceBusClient = sb.ServiceBusClient.from_connection_string( os.getenv("AzureWebJobsServiceBus") )
topicClient : sb.TopicClient = sbClient.get_topic('scoring-testtopic')

message = sb.Message( httpreq.get_body().decode( 'UTF-8' ))

message.user_properties = { 
    '@AzureWebJobsParentId' : context.invocation_id,
    'Prom' : '31000001'
    }

topicClient.send( message )