版本:2.2.4.RELEASE
队列关联和LocalizedQueueConnectionFactory
当在集群下使用HA队列时,为了更好的性能表现,你可能想连接master队列所在的物理broker。CachingConnectionFactory
可以配置多个broker地址。当进行故障切换时,客户端会按顺序尝试连接。LocalizedQueueConnectionFactory
使用admin插件提供的REST API来测定master队列在哪个节点。然后它会创建(或从缓存中重用)一个CachingConnectionFactory
仅仅连接那一个节点。如果连接失败,则确定新的主节点,并由消费者连接到该节点LocalizedQueueConnectionFactory
使用默认连接工厂进行配置,以防止无法确定队列的物理位置时,能够正常的连接到集群。
LocalizedQueueConnectionFactory
是一个RoutingConnectionFactory
,SimpleMessageListenerContainer
使用队列名称作为lookup key 正如我们在上一小节所讨论的。
因为使用队列名称作为lookup key,LocalizedQueueConnectionFactory
也仅仅被使用在这个容器监听一个队列的场景下。
此连接工厂是用来长期连接,例如SimpleMessageListenerContainer
使用的那些连接。它不像rabbittemplate使用的短链接,因为在建立连接前使用REST API的开销很大。此外,对于发布操作,队列是未知的,消息无论如何都会被发布给集群中所有成员,所以查找节点的逻辑没有价值。
下例展示了如何配置这个工厂:
@Autowired
private ConfigurationProperties props;
@Bean
public ConnectionFactory defaultConnectionFactory() {
CachingConnectionFactory cf = new CachingConnectionFactory();
cf.setAddresses(this.props.getAddresses());
cf.setUsername(this.props.getUsername());
cf.setPassword(this.props.getPassword());
cf.setVirtualHost(this.props.getVirtualHost());
return cf;
}
@Bean
public ConnectionFactory queueAffinityCF(
@Qualifier("defaultConnectionFactory") ConnectionFactory defaultCF) {
return new LocalizedQueueConnectionFactory(defaultCF,
StringUtils.commaDelimitedListToStringArray(this.props.getAddresses()),
StringUtils.commaDelimitedListToStringArray(this.props.getAdminUris()),
StringUtils.commaDelimitedListToStringArray(this.props.getNodes()),
this.props.getVirtualHost(), this.props.getUsername(), this.props.getPassword(),
false, null);
}
请注意,前三个参数是地址、管理员和节点的数组。这些是有位置要求的,因为当容器尝试连接到队列时,它使用管理API来确定队列在哪个节点上被控制,并连接到与该节点位于相同数组位置的地址。