我在ASP.NET Core应用程序中有一个HTTP端点,它向Azure Service Bus发送了几条消息。
现在,控制器操作代码执行此操作:
SELECT definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('yourSchemaName.yourStoredProcedureName')
创建的QueueClient不支持var client = QueueClient.CreateFromConnectionString(this.connectionString, entityPath);
await client.SendAsync(message);
,所以我想知道它的生命周期应该是多长时间?我为每个HTTP请求创建一个新的。 QueueClient的Dispose
方法是否缓存到服务总线的内部连接?这里的最佳解决方案是什么?我问,因为我在交通高峰期间最近从服务巴士那里收到了CreateFromConnectionString
。
答案 0 :(得分:1)
正如这位官员document提到的有关Service Bus客户端的内容:
Service Bus客户端对象(如QueueClient或MessageSender)是通过 MessagingFactory 对象创建的,还提供内部的连接管理。 发送邮件后,不应关闭邮件工厂或队列,主题和订阅客户端,然后在发送下一条邮件时重新创建它们。 关闭消息传递工厂将删除与Service Bus服务的连接,并在重新创建工厂时建立新连接。建立连接是一项昂贵的操作,您可以通过为多个操作重复使用相同的工厂和客户端对象来避免这种操作。 您可以安全地使用QueueClient对象从并发异步操作和多个线程发送消息。
我问,因为我在交通高峰期间最近从服务总线收到了TimeoutExceptions。
正如官方document中提到的关于服务总线消息 TimeoutException :
TimeoutException指示用户启动的操作所花费的时间超过操作超时。您应该检查ServicePointManager.DefaultConnectionLimit属性的值,因为达到此限制也会导致TimeoutException。
我假设您可以尝试增加OperationTimeout并添加重试逻辑,如下所示构建QueueClient并重用此QueueClient对象。
SELECT s_name, SUM(qty) AS sum
FROM Supplier, Spj
WHERE Supplier.s_num = Spj.s_num
GROUP BY s_name
HAVING qty > 1000;