持久佇列和主題如何運作
常見問題 > JMS > 持久佇列和主題如何運作
持久佇列會將訊息持久地保存下來,供任何適合的消費者消費。持久佇列不需要考慮未來哪個消費者會消費這些訊息。只有一份訊息副本,未來任何消費者都可以消費。
然而,持久主題則不同,因為它必須在邏輯上為每個持久消費者保存一份適合的訊息實例 - 因為每個持久消費者都會收到自己的訊息副本。
例如,假設一個持久訂閱者 S 在時間 D1 開始訂閱主題 T。一些發布者向主題發送訊息 M1、M2、M3,S 將收到所有這些訊息。然後 S 停止,發布者繼續發送 M4、M5。
當 S 在 D2 重新啟動時,發布者發送 M6 和 M7。現在 S 將收到 M4、M5,然後是 M6 和 M7 以及所有未來的訊息。也就是說,S 將收到從 M1 到 M7 的所有訊息。
這是持久和非持久消費之間的區別。如果 S 是非持久消費者,它只會收到 M1、M2、M3 和 M6、M7 - 而不是 M4 和 M5。也就是說,因為訂閱是持久的,所以無論訂閱者是否正在運行,S 都會收到發送到 T 的每條訊息。對於非持久主題,只有當 S 正在運行時才傳送發送到主題 T 的訊息。
因此,對於持久主題訂閱,JMS 提供者需要能夠在 S 關閉並在未來重新連線時識別 S,這樣它才能知道在 S 沒有運行時要將哪些訊息發送給它。JMS 規範規定,S 的識別是通過 clientID 和持久訂閱者名稱的組合來完成的。這樣,S 使用的 JMS 連線可以在不同的主題上,或在同一主題上使用不同的選擇器進行許多不同的持久訂閱 - 但 JMS 提供者可以知道要為哪個訂閱保留哪條訊息。
因此,在 JMS 連線上設定 clientID 對於持久主題訂閱至關重要(同時使用合理的持久消費者名稱)。對於其他 QoS,這不是問題。