簡體   English   中英

從 nodejs 服務器接收來自 ServiceBus 的 BrokeredMessage

[英]Receiving BrokeredMessage from ServiceBus from a nodejs server

我正在從新的 nodejs 服務器讀取來自現有 Azure ServiceBus 的消息。

這是消息從 .NET 服務器發送到 ServiceBus 的方式:

var topicClient = TopicClient.CreateFromConnectionString(serviceBusConnectionString, routingKey);    
var brokeredMessage = new BrokeredMessage(message.ToJson());
topicClient.Send(brokeredMessage);

其中 topicClient 是 Microsoft.ServiceBus.Messaging.TopicClient

我正在使用以下方法使用 azure-sb package 在 nodejs 服務器上讀取消息:

sbClient = ServiceBusClient.createFromConnectionString(connectionString)  
subscriptionClient = this.sbClient.createSubscriptionClient(topicName, subscriptionName);
receiver = this.subscriptionClient.createReceiver(ReceiveMode.receiveAndDelete);
messages = await this.receiver.receiveMessages(10,10);
console.log(messages.map(message => { message.body }));

message.body 是一個緩沖區,當我執行 message.body.toString('utf-8') 時,我得到如下信息:

@string3http://schemas.microsoft.com/2003/10/Serialization/��{VALID JSON}

我當然對介於兩者之間的有效 JSON 感興趣。 在 .net 服務器中,我們只需執行 brokeredMessage.GetBody() 並得到 object,那么在 nodejs 上有沒有簡單的方法來做同樣的事情?

根據我的測試,如果我們使用標准庫Microsoft.Azure.ServiceBus在.Net應用程序中發送消息,它會直接JSON在節點應用程序中解析消息

例如

這是我發送消息的 C# 代碼:

class Program
{
    static void Main(string[] args)
    {
        string connectionString = "Endpoint=sb://...";
        var client = new TopicClient(connectionString, "");
        var payload = JsonConvert.SerializeObject(new DemoMessage() { Title = $"hello!!! {DateTime.Now}" });
        var serviceBusMessage = new Message(Encoding.UTF8.GetBytes(payload));
        serviceBusMessage.SessionId = Guid.NewGuid().ToString("D");

        client.SendAsync(serviceBusMessage).Wait();

    }

    private class DemoMessage
    {
        public DemoMessage()
        {
        }

        public string Title { get; set; }
    }

這是我接收消息的 Node.js 代碼:

const { ServiceBusClient, ReceiveMode } = require("@azure/service-bus");

// Define connection string and related Service Bus entity names here
const connectionString =
  "Endpoint=sb://";
const topicName = "***";
const subscriptionName = "***";

async function main() {
  const sbClient = ServiceBusClient.createFromConnectionString(
    connectionString,
  );
  const subscriptionClient = sbClient.createSubscriptionClient(
    topicName,
    subscriptionName,
  );
  const receiver = subscriptionClient.createReceiver(ReceiveMode.receiveAndDelete);

  try {
    const messages = await receiver.receiveMessages(1);
    console.log("Received messages:");
    console.log(messages.map((message) => message.body));
    await subscriptionClient.close();
  } finally {
    await sbClient.close();
  }
}

main().catch((err) => {
  console.log("Error occurred: ", err);
});

在此處輸入圖像描述

此外,如果您仍然使用庫WindowsAzure.ServiceBus ,我們需要使用BrokeredMessage(Stream messageBodyStream, bool ownsStream)來初始化 object。

因為我們使用BrokeredMessage(platload)進行初始化,所以它將使用 DataContractSerializer 和二進制 XmlDictionaryWriter 來初始化 object。 因此,負載正在使用帶有二進制 XmlDictionaryWriter 的 DataContractSerializer 進行序列化,這就是為什么消息正文在其開頭具有類型指示@string3http://schemas.microsoft.com/2003/10/Serialization/的原因.

例如這是我發送消息的 C# 代碼:

var client =TopicClient.CreateFromConnectionString(connectionString, "test");
            var payload = JsonConvert.SerializeObject(new DemoMessage() { Title = $"hello BrokeredMessage!!! {DateTime.Now}" });
            using (Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(payload))) {
                var serviceBusMessage = new BrokeredMessage(stream,true);
                await client.SendAsync(serviceBusMessage);

            }

我使用相同的代碼接收在此處輸入圖像描述

更多詳情,請參閱此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM