我一直在处理来自TopicClient的大量Timeout,我认为它可能与对象的生命周期和处理有关。
我正在使用TopicClient
中的Microsoft.ServiceBus.Messaging
课程并阅读此Best Practices Guide个州
发送邮件后,不应关闭邮件工厂或队列,主题和订阅客户端,然后在发送下一条邮件时重新创建它们。关闭消息传递工厂将删除与Service Bus服务的连接,并在重新创建工厂时建立新连接。
这让我感到困惑 - 本文档没有具体提及TopicClient
,但我认为它适用。也许这个假设是不正确的?
我可以将我的TopicClient存储在静态成员中以避免重新创建连接吗?有没有更好的方法来处理这个?是否存在某种我应该使用的连接池机制?
答案 0 :(得分:9)
TopicClient的所有静态和实例成员都是线程安全的documentation indicates。
“此类型的任何公共静态(在Visual Basic中为Shared)成员都是 线程安全。实例成员也保证是线程安全的。“
我读了你所包含的引用,因为它特别包含了TopicClient,因为它说的是“队列,主题和订阅客户端”。我把它读作QueueClient,TopicClient和SubscriptionClient。
对于消息传递子系统,我倾向于使用Gateway Pattern,它可以用来处理使用消息传递子系统所必需的对象的生命周期。在您的情况下,Gateway对象将处理TopicClient或MessageSender / Receivers的生命周期。
我会问您是否看过更通用的MessageSender和MessageReceiver类?在发送时使用这些更通用的对象意味着执行发送的客户端代码不必知道它是否正在发送到主题或队列,它只能发送到该地址而不关心。
答案 1 :(得分:2)
只需从Best Practices for performance improvements using Service Bus Messaging添加来自MS的另一条确认是线程安全的确认:
您可以安全地使用QueueClient对象从并发异步操作和多个线程发送消息。
他们没有明确提及TopicClient
,但希望TopicClient与QueueClient
一样