2013-04-02 14 views
5

我一直在处理来自TopicClient的一系列Timeout,我认为它可能与对象的生命周期和处置有关。是Azure TopicClient线程安全吗?

我使用的是从Microsoft.ServiceBus.MessagingTopicClient类阅读本Best Practices Guide状态

你不应该在您关闭工厂的消息或队列,主题和订阅的客户端发送消息,然后重新创建它们当你发送下一条消息时。关闭消息传送工厂会删除与服务总线服务的连接,并在重新创建工厂时建立新的连接。

这让我感到困惑 - 本文档没有具体提及TopicClient,但我认为它适用。也许这个假设是不正确的?

我可以将我的TopicClient存储在静态成员中以避免重新创建连接吗?有没有更好的方法来处理这个问题?我应该使用某种连接池机制吗?

回答

7

documentation indicates TopicClient的所有静态和实例成员都是线程安全的。

“这种类型的任何公共静态(共享在Visual Basic)成员都是 线程安全的实例成员也保证线程安全的。”

我读了你引用的报价,因为它专门包含TopicClient,因为它说“队列,主题和订阅客户端”。我将其作为QueueClient,TopicClient和SubscriptionClient读取。

对于消息传递子系统,我倾向于使用Gateway Pattern,它可用于处理使用消息传递子系统所需的对象的生命周期。在你的情况下,Gateway对象将处理TopicClient或MessageSender/Receivers的生命周期。

我会问你是否看过更通用的MessageSenderMessageReceiver类?发送时使用这些更通用的对象意味着执行发送的客户端代码不必知道它是否发送到主题或队列,它可以发送到地址而不在意。