.Net Core 中 ServiceBus MessagingFactory 的替代品是什么?
What is alternate of ServiceBus MessagingFactory in .Net Core?
在将我的项目从 .Net framework 4.7 转换为 .Net core 2.1 时,我遇到了 Servicebus MessagingFactory
的问题。我在 .Net 核心的新 nuget 包 Microsoft.Azure.ServiceBus
中没有看到任何 MessagingFactory
class。
我的 .Net framework 4.7 代码
private static readonly string messagingConnectionString = Environment.GetEnvironmentVariable("ServiceBusConnection");
private static Lazy<MessagingFactory> lazyMessagingFactory = new Lazy<MessagingFactory>(() =>
{
return MessagingFactory.CreateFromConnectionString(messagingConnectionString);
});
public static MessagingFactory MessagingFactory
{
get
{
return lazyMessagingFactory.Value;
}
}
public static MessagingFactory EventHubMessageFactory
{
get
{
return lazyEventhubMessagingFactory.Value;
}
}
public async Task SendMessageToQueueAsync(string queueName, string message)
{
QueueClient queueClient = MessagingFactory.CreateQueueClient(queueName);
BrokeredMessage brokeredMessage = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(message)), true);
await queueClient.SendAsync(brokeredMessage);
}
它是一个 best practices 的高性能应用程序,而且我在单个服务总线命名空间下有很多队列,我根据配置推送消息。我不想在每个请求中创建 QueueClient
对象,也不想为每个队列维护连接字符串。
.Net Core 中 MessagingFactory
的替代项是什么?
https://github.com/MicrosoftDocs/azure-docs/issues/46830
https://github.com/Azure/azure-service-bus-dotnet/issues/556
While MessagingFactory is gone, the idea of connection pooling and sharing connections is there. When you create your clients, passing a connection will reuse it. When passing a connection string, will cause clients to establish a new connection.
因此您可以手动创建一个 ServiceBusConnection 或重复使用现有客户端之一。您可以在您创建的客户端的构造函数中传递连接对象。注意不要意外关闭连接,例如通过关闭创建它的客户端。
将.Net Framework 代码迁移到.Net Core 时有重大变化,您可以看到Guide for migrating to Azure.Messaging.ServiceBus from Microsoft.Azure.ServiceBus
示例如下
static void Main(string[] args)
{
string connectionString = "<connection_string>";
string queueName = "<queue_name>";
// since ServiceBusClient implements IAsyncDisposable we create it with "await using"
var client = new ServiceBusClient(connectionString);
// create the sender
ServiceBusSender sender = client.CreateSender(queueName);
for (int i = 0; i < 10; i++)
{
// create a message that we can send. UTF-8 encoding is used when providing a string.
ServiceBusMessage message = new ServiceBusMessage($"Hello world {i}!");
// send the message
sender.SendMessageAsync(message).GetAwaiter().GetResult();
}
sender.DisposeAsync().GetAwaiter().GetResult();
client.DisposeAsync().GetAwaiter().GetResult();
}
在将我的项目从 .Net framework 4.7 转换为 .Net core 2.1 时,我遇到了 Servicebus MessagingFactory
的问题。我在 .Net 核心的新 nuget 包 Microsoft.Azure.ServiceBus
中没有看到任何 MessagingFactory
class。
我的 .Net framework 4.7 代码
private static readonly string messagingConnectionString = Environment.GetEnvironmentVariable("ServiceBusConnection");
private static Lazy<MessagingFactory> lazyMessagingFactory = new Lazy<MessagingFactory>(() =>
{
return MessagingFactory.CreateFromConnectionString(messagingConnectionString);
});
public static MessagingFactory MessagingFactory
{
get
{
return lazyMessagingFactory.Value;
}
}
public static MessagingFactory EventHubMessageFactory
{
get
{
return lazyEventhubMessagingFactory.Value;
}
}
public async Task SendMessageToQueueAsync(string queueName, string message)
{
QueueClient queueClient = MessagingFactory.CreateQueueClient(queueName);
BrokeredMessage brokeredMessage = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(message)), true);
await queueClient.SendAsync(brokeredMessage);
}
它是一个 best practices 的高性能应用程序,而且我在单个服务总线命名空间下有很多队列,我根据配置推送消息。我不想在每个请求中创建 QueueClient
对象,也不想为每个队列维护连接字符串。
.Net Core 中 MessagingFactory
的替代项是什么?
https://github.com/MicrosoftDocs/azure-docs/issues/46830
https://github.com/Azure/azure-service-bus-dotnet/issues/556
While MessagingFactory is gone, the idea of connection pooling and sharing connections is there. When you create your clients, passing a connection will reuse it. When passing a connection string, will cause clients to establish a new connection.
因此您可以手动创建一个 ServiceBusConnection 或重复使用现有客户端之一。您可以在您创建的客户端的构造函数中传递连接对象。注意不要意外关闭连接,例如通过关闭创建它的客户端。
将.Net Framework 代码迁移到.Net Core 时有重大变化,您可以看到Guide for migrating to Azure.Messaging.ServiceBus from Microsoft.Azure.ServiceBus
示例如下
static void Main(string[] args)
{
string connectionString = "<connection_string>";
string queueName = "<queue_name>";
// since ServiceBusClient implements IAsyncDisposable we create it with "await using"
var client = new ServiceBusClient(connectionString);
// create the sender
ServiceBusSender sender = client.CreateSender(queueName);
for (int i = 0; i < 10; i++)
{
// create a message that we can send. UTF-8 encoding is used when providing a string.
ServiceBusMessage message = new ServiceBusMessage($"Hello world {i}!");
// send the message
sender.SendMessageAsync(message).GetAwaiter().GetResult();
}
sender.DisposeAsync().GetAwaiter().GetResult();
client.DisposeAsync().GetAwaiter().GetResult();
}