2013-05-09 57 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()

相關問題