我正在编写一个简单的函数,当新消息进入Service Bus队列时会触发该函数。该函数的输入是DocumentDB文档。我需要访问文档中的值并将其输入控制台日志。
创建Service Bus队列触发器绑定时,会自动创建它:
public static void Run(string myQueueItem, TraceWriter log)
{
log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}
现在要访问我的数据库中的正确文档,根据this page,可以设置绑定,以便从队列消息中获取文档ID:
id支持类似于{queueTrigger}的绑定,它使用队列消息的字符串值作为文档Id。
这意味着您可以将消息发送到队列,然后绑定到您的文档,如下所示:
{
"name": "inputDocument",
"type": "documentDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"id" : "{myQueueItem}",//<<<
"connection": "MyAccount_DOCUMENTDB",
"direction": "in"
}
到目前为止,一切似乎都按预期工作。但是,为了将消息发送到Service Bus队列,您必须将其作为BrokeredMessage类型(link)发送。当你这样做时,你不能再以字符串形式访问消息,使自动创建的函数无用。
可以通过以下方式使用BrokeredMessages:
project.json:
{
"frameworks": {
"net46":{
"dependencies": {
"WindowsAzure.ServiceBus": "2.7.6"
}
}
}
}
run.csx:
using Microsoft.ServiceBus.Messaging;
....
log.Info($"C# ID: {queueItem.GetBody<string>()})
但我无法找到如何将{queueItem.GetBody<string>()}
传递到输入文档绑定的id
属性中。所以我不能再使用前面提到的通过"id" : "{myQueueItem}"
绑定我的documentdb输入的方法,因此无法从任何文档中读取任何值。
有没有办法将原始字符串发送到总线队列或BrokeredMessage真的唯一的可能性? (从我能够找到的,原始字符串是不可能的)
如果BrokeredMessage确实是唯一的方法,是否仍然可以从消息中获取字符串值并将其用作DocumentDB文档的ID?
如果上述两种情况都不可能,请您指点我正确的方向吗?
对我的功能有更完整的解释:
应用程序会定期将新文档发送到DocumentDB数据库。与文档一起(在等待插入完成之后),它将带有新文档ID的消息发送到Service Bus队列。然后触发器连接到新文档并检查其中的整数值。如果该值大于10,则会发送有关它的电子邮件通知。
我已经成功创建了这个并通过基于Web的编辑器手册运行,并使用其中一个文档的字符串id作为测试输入。但是,当我尝试将其与自动发送文档和消息的应用程序一起使用时,我遇到了如上所述的BrokeredMessage问题。
以下是没有BrokeredMessage的wórking函数的完整代码:
using System;
using System.Net;
using System.Net.Mail;
public static void Run(string queueItem, dynamic inputDocument, TraceWriter log)
{
log.Info($"C# ID: {queueItem}, Value: {inputDocument.Value}");
if (inputDocument.Value > 10)
{
var fromAddress = new MailAddress("---@gmail.com", "From ---");
var toAddress = new MailAddress("---@gmail.com", "To ---");
const string fromPassword = "---";
const string subject = "Notification";
const string body = "Temperature too high!";
var smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}
}
}
答案 0 :(得分:3)
这是一个工作示例,显示如何以POCO形式接收ServiceBus消息并绑定到它的属性。
如果使用正确的application/json
内容类型向队列发送消息,该函数将为您反序列化为POCO,文档数据库输入绑定将绑定到DocumentId
属性并检索给你的文件。您无需在project.json中添加任何内容即可使用。
function.json
文件:
{
"bindings": [
{
"name": "input",
"type": "serviceBusTrigger",
"direction": "in",
"queueName": "<your-queue.",
"connection": "<your-connection>",
"accessRights": "Manage"
},
{
"type": "documentDB",
"name": "document",
"databaseName": "<your-db>",
"collectionName": "<your-collection>",
"id": "{DocumentId}",
"connection": "<your-connection>",
"direction": "in"
}
]
}
功能代码:
using System;
using System.Threading.Tasks;
public class Input
{
public string DocumentId { get; set; }
public int Value { get; set; }
}
public static void Run(Input input, dynamic document, TraceWriter log)
{
log.Info($"Message received (DocumentId: {input.DocumentId}, Value {input.Value})");
log.Info($"Document read {document.id}");
}
对于C#函数,要使用绑定参数(例如{DocumentId}
参数),必须将触发器输入绑定到定义这些属性的POCO对象。
要发送电子邮件,您还可以查看我们的SendGrid输出绑定。我们在“样本”下的门户网站上提供了完整的“SendGrid-CSharp”样本:)