これは、永続的なサブスクリプションを作成するコンテキストにあります。
DefaultMessageListenerContainerに setClientId() があり、SingleConnectionFactory にもう 1 つ存在します。
私の理解は次のとおりです。
- 永続サブスクリプションは、コンシューマー/サブスクライバー向けです。
- 異なるコンシューマーは、異なるクライアント ID を使用できる必要があります。
- 異なるコンシューマが接続を共有できる必要があります。
- コンシューマごとに 1 つの (ListenerContainer,Listener) ペアがあります。
したがって、ListenerContainer で setClientId() を使用することは理にかなっています。
しかし、接続ファクトリ レベルで setClientId() があるのはなぜですか?
SingleConnectionFactory には単一の接続しかありませんが、その接続は、複数のセッションにわたって複数のコンシューマーによって共有される可能性があります。右 ?言うまでもなく、(SingleConnectionFactory からこのメソッドを継承する) CachingConnectionFactory の場合はより危険です。
拡張バージョン: Single/CachingConnectionFactory で setClientId() を使用すべきではないと言えますか? これは、DefaultMessageListenerContainer の setClientId() 内の次のステートメントによってさらに必須になります。
さらに、元の ConnectionFactory がまだクライアント ID を割り当てていない場合にのみ、クライアント ID を割り当てることができます。
そのため、誰かが CachingConnectionFactory で誤って ClientId を設定した場合、DefaultMessageListenerContainer のクライアント ID の今後のセットは no-ops になります。