2013-05-09 55 views
2

这是创建持久订阅的上下文。
有一个SETCLIENTID()在DefaultMessageListenerContainer,另一个在SingleConnectionFactory我们是否应该在连接工厂上调用setClientId()?

我的理解是:

  • 长期订阅是消费者/用户。
  • 不同的消费者应该能够使用不同的客户ID。
  • 不同的消费者应该能够共享一个连接。
  • 没有每个消费者酮(ListenerContainer,监听器)对。

因此,它对ListenerContainer的setClientId()是有意义的。

但是,为什么会有一个SETCLIENTID()连接工厂的水平?

即使SingleConnectionFactory只有一个连接,该连接可以由多个使用者在多个会话中共享。对 ? 不用说,它是一个CachingConnectionFactory(其继承SingleConnectionFactory此方法)更危险。

扩展版本: 我们可以说在一个单人/ CachingConnectionFactory一个不应使用SETCLIENTID()? 这在使用DefaultMessageListenerContainer的SETCLIENTID()做更有必要通过了如下声明:

此外,客户端ID只能如果原来 连接工厂尚未分配一个

所以分配,如果有人不小心在CachingConnectionFactory上设置了ClientId,那么DefaultMessageListenerContainer上未来的客户端ID将是no-ops!

回答

1

但是,为什么会在连接工厂级别有setClientId()?

setClientId()上的连接工厂用于管理性地设置客户端ID,以防止消费者应用程序手动设置它;实际上,根据JMS规范,如果客户端设置客户端ID,当客户端已经由工厂设置时,会抛出异常。

我们可以说一个人不应该使用 Single/CachingConnectionFactory上的setClientId()吗?

如果您需要为不同的用户长期订阅,每一个都有自己的客户端ID,使用subscriber.setClientId(),因为如果使用connectionFactory.setClientId()并尝试从同一个工厂与客户端ID建立多个连接已经建立,工厂会抛出一个异常,抱怨“连接clientId已经连接。“

就我个人而言,我喜欢在我的代码中具有灵活性和完全控制,所以我使用subscriber.setClientId()

相关问题