[英]How to add message to azure service bus from azure function?
How does one add message to service bus, if I already have a message in json format. 如果我已经有json格式的消息,如何将消息添加到服务总线。 I am able to add message using azure function output binding, but none of the message properties are seen in servicebusexplorer or queueexplorer. 我可以使用azure函数输出绑定添加消息,但是在servicebusexplorer或queueexplorer中都看不到任何消息属性。
I need to resubmit about 1K of messages, there was an error on the messages, so I exported them to file, fixed it in notepad++ and now I created a azure function that reads the file and puts it in the queue. 我需要重新提交大约1K的消息,消息上有错误,因此我将它们导出到文件中,并在notepad ++中进行了修复,现在我创建了一个azure函数来读取文件并将其放入队列中。 But when I look at the message none of the message properties show up in servicebusexploerer. 但是,当我查看消息时,servicebusexploerer中都不会显示任何消息属性。
run.csx run.csx
#r "Newtonsoft.Json"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Threading.Tasks;
using System.Configuration;
const string QueueName = "commands";
static string FileName = "messages.json";
public static async Task<string> Run(HttpRequest req, ILogger log,
ExecutionContext context, ICollector<string> outputSbQueue)
{
log.LogInformation("Starting processing messages.");
var filePath = System.IO.Path.Combine(context.FunctionDirectory, FileName);
log.LogInformation("Path: " + filePath);
var text = File.ReadAllText(filePath);
log.LogInformation("Message: " + text);
JArray messages = JArray.Parse(text);
log.LogInformation("Number of message: " + messages.Count);
await SendMessagesAsync(messages,log,outputSbQueue);
// return req.CreateResponse(HttpStatusCode.OK,
// "Updated",
// "text/plain");
return "test";
}
static async Task SendMessagesAsync(JArray messages, ILogger log,
ICollector<string> outputSbQueue )
{
log.LogInformation("About to iterate messages");
foreach (var message in messages)
{
log.LogInformation("Sending Message");
outputSbQueue.Add(message.ToString());
log.LogInformation("Sent message: " + message);
}
}
messages.json messages.json
[
{
"Body": {
"PaymentPlanId": "2141110b-07da-46b7-a166-ffc7f9f6c5af",
"InstallmentId": "3bd27b0d-3372-456c-856c-74e09de1413a",
"Date": "2018-12-05T00:00:00",
"Amount": 66.89,
"Attempt": 0,
"PaymentCorrelationId": "2ae7511e-706f-4d7f-b44b-9690d0fcbf38",
"CommandId": "a2d5ae26-6289-4cca-bce0-7a1905b64378"
},
"ContentType": "text/plain",
"CorrelationId": null,
"DeadLetterSource": "commands",
"DeliveryCount": 1,
"EnqueuedSequenceNumber": 14684,
"EnqueuedTimeUtc": "2018-12-06T13:22:37.131Z",
"ExpiresAtUtc": "9999-12-31T23:59:59.9999999",
"ForcePersistence": false,
"IsBodyConsumed": false,
"Label": "PayDueInstallmentCommand",
"LockedUntilUtc": null,
"LockToken": null,
"MessageId": "a2d5ae26-6289-4cca-bce0-7a1905b64378",
"PartitionKey": null,
"Properties": {
"BodyClrType": "SR.Domain.Commands.PayDueInstallmentCommand, SR.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"ParentId": "|Dz4Pxv65XMA=.3975a8a2_32.",
"RootId": "Dz4Pxv65XMA=",
"Diagnostic-Id": "|Dz4Pxv65XMA=.3975a8a2_32.1.",
"DeadLetterReason": "NoCommandInMessage",
"DeadLetterErrorDescription": "There was no command in the message.",
"Test":"1"
},
"ReplyTo": null,
"ReplyToSessionId": null,
"ScheduledEnqueueTimeUtc": "2018-12-06T13:22:36.877Z",
"SequenceNumber": 14684,
"SessionId": null,
"Size": 938,
"State": 0,
"TimeToLive": "10675199.02:48:05.4775807",
"To": null,
"ViaPartitionKey": null
}
]
function.json function.json
{
"bindings": [
{
"authLevel": "function",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"methods": [
"get",
"post"
]
},
{
"name": "$return",
"type": "http",
"direction": "out"
},
{
"name": "outputSbQueue",
"type": "serviceBus",
"queueName": "deadletter",
"connection": "ServiceBusConnectionString",
"direction": "out"
}
],
"disabled": false
}
The assembly problem is easy to fix as @Roman has mentioned. 正如@Roman所提到的,组装问题很容易解决。 Since you have created a v2 function(default if you haven't modified runtime version of new Function app), add command below. 由于您已经创建了v2函数(如果尚未修改新Function应用的运行时版本,则为默认值),因此请在下面添加命令。
#r "..\\bin\\Microsoft.Azure.ServiceBus.dll"
using Microsoft.Azure.ServiceBus;
Another problem is the structure of your JSON model. 另一个问题是JSON模型的结构。 It's actually based on BrokeredMessage in Microsoft.ServiceBus.Messaging
instead of Message in Microsoft.Azure.ServiceBus
. 它实际上是基于BrokeredMessage在Microsoft.ServiceBus.Messaging
,而不是消息在Microsoft.Azure.ServiceBus
。 You may have to decide which one to use and refactor Json if necessary. 您可能必须决定使用哪个,并在必要时重构Json。 Note that some of the properties are set by Azure Service Bus Service, which we can't modify in new created messages. 请注意,某些属性是由Azure Service Bus Service设置的,我们无法在新创建的消息中进行修改。
Make an example of Message
. 举一个Message
的例子。 Refactor the JSON according to Message
Class, including all properties configurable. 根据Message
类重构JSON,包括所有可配置的属性。
[
{
"Body": {
"PaymentPlanId": "2141110b-07da-46b7-a166-ffc7f9f6c5af",
...
},
"ContentType": "text/plain",
"Label": "MyLable",
"MessageId": "a2d5ae26-6289-4cca-bce0-7a1905b64378",
"ScheduledEnqueueTimeUtc": "2018-12-06T13:22:36.877Z",
"TimeToLive": "10675199.02:48:05.4775807",
"CorrelationId": null,
"PartitionKey": null,
"ReplyTo": null,
"ReplyToSessionId": null,
"SessionId": null,
"To": null,
"ViaPartitionKey": null
"UserProperties": {
"CustomProperty":"test",
...
}
}
]
We can't directly use Deserialization like JsonConvert.DeserializeObject
as the message body requires byte[]
. 我们不能像JsonConvert.DeserializeObject
那样直接使用反序列化,因为消息正文需要byte[]
。
foreach (var message in messages)
{
// Get Body first
var body = System.Text.Encoding.UTF8.GetBytes(message["Body"].ToString());
// Empty Body section to deserialize properties
message["Body"] = "";
var SBMessage = JsonConvert.DeserializeObject<Message>(message.ToString());
SBMessage.Body = body;
log.LogInformation("Sending Message");
outputSbQueue.Add(SBMessage);
log.LogInformation("Sent message: " + SBMessage.MessageId);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.