gpt4 book ai didi

c# - 如何在c#中监听序列化的Azure Message Bus消息?

转载 作者:行者123 更新时间:2023-12-03 05:11:06 26 4
gpt4 key购买 nike

我正在使用 Azure 消息总线与我的微服务进行通信。我能够在主题“Account Updated from service A”下发送消息。但是,该消息未被另一个名为 B 的服务读取。我的意思是,如果我发送“Hello”字符串,则它会被正确读取。但序列化消息并未在监听器处解码。

这是从服务 A 发送的消息:

var invoiceMessage = new InvoiceMessageDto<AccountInvoicingMessageDto>
{
MessageType = MessageType.Create,
InvoiceType = InvoiceType.Account,
CreationDateTime = DateTime.Now,
MessageDto = new AccountInvoicingMessageDto
{
AccountId = request.Id,
OrganizationName = request.OrganizationName,
AccountStatus = AccountStatusEnum.ApprovedPendingPayment,
FlatFee = flatfee
}
};

try
{
Console.WriteLine("Success Success when sending Account Message");
_logger.LogInformation($"Success when sending Account Update Message");
_azServiceBusConsumer.SendMessage(invoiceMessage, MessageTopics.ACCOUNT_UPDATED);
}
catch (Exception ex)
{
_logger.LogInformation($"Error when sending Message: {ex}");
}

_azServiceBusConsumer 是接口(interface) IAzServiceBusConsumer 的实例,如下所示:

enter image description here

namespace Services.Common.Interface
{
public interface IAzServiceBusConsumer
{

void Start();
void Stop();

void SendMessage(IntegrationBaseMessage message, string? topicName);

}
}

这是我在服务 B 中收听它的方式:

_receiverClient 定义为:

 _receiverClient = new SubscriptionClient(_config["MessageBus:ConnectionString"],
MessageTopics.ACCOUNT_UPDATED,
_config["MessageBus:SubscriptionName"],
ReceiveMode.PeekLock,
RetryPolicy.Default);

然后它被监听器用作:

_receiverClient.RegisterMessageHandler(async (message, cancelToken) =>
{
var bodyBytes = message.Body;
var ourMessage = Encoding.UTF8.GetString(bodyBytes);

_logger.LogInformation($"Received: {ourMessage}");
}

在 Debug模式下选中时,message 变量显示收到的消息,但当鼠标悬停在此处时,bodyBytes 不显示任何内容。

那么,我应该如何解码监听器(服务 B)收到的消息?

任何帮助都会非常有意义。

最佳答案

queue的RegisterMessageHandler方法用于注册处理消息的函数。此方法需要两个参数:处理程序和消息处理程序选项。类似的东西:

// Configure the MessageHandler Options in terms of exception handling, number of concurrent messages to deliver etc.  
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
MaxConcurrentCalls = 1,
AutoComplete = false
};

// Register the function that will process messages

queueClient.RegisterMessageHandler(await queueClient.CompleteAsync(message.SystemProperties.LockToken), messageHandlerOptions);

之后你的queueClient就准备好调用CloseAsync()了

  queueClient.CloseAsync().Wait();

你的发件人应该是这样的

  var message = new Message(Encoding.UTF8.GetBytes(messageBody));  
await queueClient.SendAsync(message);

关于c# - 如何在c#中监听序列化的Azure Message Bus消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76810121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com