从Microsoft.Azure.ServiceBus迁移到Azure.Messaging.ServiceBus

z2acfund  于 2023-05-23  发布在  其他
关注(0)|答案(3)|浏览(237)

我正在尝试更新此函数以使用Azure.Messaging.ServiceBus并完全删除Microsoft.Azure.ServiceBus,但似乎找不到任何资源。有人知道如何使用这个包向主题发送消息吗?
旧的函数是:

  1. public async Task SendMessageToServiceBusTopic<T>(T request, string topicSubName, string submissionNumber)
  2. {
  3. ServiceBusConnectionStringBuilder serviceBusConnectionStringBuilder =
  4. new ServiceBusConnectionStringBuilder(settings.ServiceBusConnectionString)
  5. {
  6. EntityPath = settings.ServiceBusTopic
  7. };
  8. TopicClient topicClient = new TopicClient(serviceBusConnectionStringBuilder);
  9. byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(request));
  10. await topicClient.SendAsync(new Message(bytes)
  11. {
  12. CorrelationId = context.CorrelationId,
  13. Label=topicSubName,
  14. UserProperties = { new KeyValuePair<string, object>("TrackingId", submissionNumber) }
  15. });
  16. }

到目前为止,我已经做到了:
我走的方向对吗?

  1. public async Task SendMessageToServiceBusTopic<T>(T request, string topicSubName, string submissionNumber)
  2. {
  3. ServiceBusClient client = new ServiceBusClient(settings.ServiceBusConnectionString);
  4. ServiceBusSender s = client.CreateSender(settings.ServiceBusTopic);
  5. byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(request));
  6. await s.SendMessageAsync(new ServiceBusMessage(bytes));
  7. }
h6my8fg2

h6my8fg21#

虽然每次都可以构造服务总线客户机,但这并不理想。假设您使用的是最新的In-Proc SDK,您可以使用以下选项之一:

  1. [FunctionName("PublishToTopic")]
  2. public static async Task Run(
  3. [TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
  4. [ServiceBus("<topic_name>", Connection = "<connection_name>")] IAsyncCollector<ServiceBusMessage> collector)
  5. {
  6. await collector.AddAsync(new ServiceBusMessage(new BinaryData($"Message 1 added at: {DateTime.Now}")));
  7. await collector.AddAsync(new ServiceBusMessage(new BinaryData($"Message 2 added at: {DateTime.Now}")));
  8. }

或者,

  1. [FunctionName("PublishWithSender"]
  2. public static async Task Run(
  3. [TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
  4. [ServiceBus("<topic_name>", Connection = "<connection_name>")] ServiceBusSender sender)
  5. {
  6. await sender.SendMessagesAsync(new[]
  7. {
  8. new ServiceBusMessage(new BinaryData($"Message 1 added at: {DateTime.Now}")),
  9. new ServiceBusMessage(new BinaryData($"Message 2 added at: {DateTime.Now}"))
  10. });
  11. }

对于隔离工作者SDK,它有些不同。详情请参见this post

展开查看全部
inn6fuwd

inn6fuwd2#

我和你的情况一样(试图迁移到Azure.Messaging.ServiceBus,这是微软现在推荐的NuGet)。
你可以从他们的Github上看一下迁移指南,了解如何使过渡更平滑:https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/servicebus/Azure.Messaging.ServiceBus/MigrationGuide.md
/!*IQueueClientITopicClient*(均来自Microsoft.Azure.ServiceBus)已合并为一个名为ServiceBusSender的对象。
为什么?让我们的生活更轻松!实际上,在幕后,ServiceBusSender现在负责发送消息的过程,特别是因为队列和主题不能具有相同的名称(如果我没有错的话)。
下面是我使用新库发送消息的示例代码:

  1. /// <summary>
  2. /// Send a message by serializing as JSON the object in input.
  3. /// </summary>
  4. /// <param name="queueOrTopicName">Name of the queue or topic where the message will be sent.</param>
  5. /// <param name="messageToSend">Any C# object</param>
  6. /// <returns></returns>
  7. public async Task SendMessage(string queueOrTopicName, object messageToSend)
  8. {
  9. //ServiceBusSender should not be disposed (according to the documentation, Github, etc.)
  10. await using ServiceBusClient client = new ServiceBusClient(connectionString: "Your-ServiceBus-ConnectionString");
  11. await using ServiceBusSender sender = client.CreateSender(_queueOrTopicName);
  12. // create a message that we can send. UTF-8 encoding is used when providing a string.
  13. ServiceBusMessage message = BuildServiceBusMessage(messageToSend);
  14. // Finally send the message
  15. await sender.SendMessageAsync(message);
  16. }
  17. private ServiceBusMessage BuildServiceBusMessage<T>(T entity)
  18. {
  19. string serializedMessage = JsonConvert.SerializeObject(entity); // Still using Newtonsoft.Json but I don't see any obstacles of using System.Text.Json.
  20. ServiceBusMessage message = new ServiceBusMessage(serializedMessage)
  21. {
  22. MessageId = Guid.NewGuid().ToString(),
  23. ContentType = "application/json; charset=utf-8",
  24. };
  25. return message;
  26. }

如果您需要进行依赖注入(例如,重用同一个ServiceBusClient对象,避免为要发送的每条消息示例化ServiceBusClient),可以参考我本周发现的这个堆栈溢出
How to register ServiceBusClient for dependency injection?

展开查看全部
k4ymrczo

k4ymrczo3#

你的方向是对的没有简单的迁移工具/示例,因为它们是处理相同服务(Azure服务总线)的不同库。

相关问题