简体   繁体   English

如何从azure功能向azure服务总线添加消息?

[英]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 . 它实际上是基于BrokeredMessageMicrosoft.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.

相关问题 如何将二进制消息从 Azure 函数发送到 Azure 服务总线 - How to send a binary message from Azure Function to Azure Service Bus Azure 服务总线 - 如何将元数据添加到消息中 - Azure service bus - how to add metadata to the message 如何将服务总线消息标记为从 Azure 函数处理? - How mark a Service Bus message as processed from an Azure function? 如何从 Azure Function 更新服务总线消息? - How to renew Service Bus message from Azure Function? 从天蓝色功能发送天蓝色服务总线中的完整代理消息 - send a full brokered message in azure service bus from an azure function How to trigger both Azure Function by Service Bus message and output message to Service Bus within single Azure Function - How to trigger both Azure Function by Service Bus message and output message to Service Bus within single Azure Function Azure Function 和服务总线 - 有条件地添加新消息 - Azure Function and Service bus - conditionally add a new message 如何从Azure函数将消息发布到Azure Service Bus? - How do I post a message to a Azure Service Bus from my Azure function? 从 SQL 向 Azure 服务总线队列添加消息 - Add message to Azure Service Bus Queue from SQL Azure函数从服务总线两次读取队列消息 - Azure function reading queue message twice from service bus
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM