我有一个用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:期望字符串或其他字符缓冲区对象
我尝试使用buffer
和memoryview
函数,但仍然有另一个例外:
TypeError:无法进行内存查看,因为对象没有缓冲区接口
我想知道实际绑定是否支持BrokeredMessage以及如何处理它?</ p>
答案 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 )