一般来说,当您需要唯一命名、独占、自动删除的队列时,我们建议您使用 AnonymousQueue 而不是代理定义的队列名称(使用“”作为队列名称会导致代理生成队列名称)。
这是因为:
队列实际上是在建立与代理的连接时声明的。 这是在创建 Bean 并将其连接在一起之后很长一段时间。 使用队列的 Bean 需要知道其名称。
事实上,当应用程序启动时,代理甚至可能没有运行。
2. 如果由于某种原因与代理的连接丢失,管理员会重新声明具有相同名称的 AnonymousQueue。 如果我们使用代理声明的队列,队列名称将会更改。
您可以控制 AnonymousQueue 实例使用的队列名称的格式。
默认情况下,队列名称以 spring.gen- 为前缀,后跟 UUID 的 Base64 表示形式——例如:spring.gen-MRBv9sqISkuCiPfOYfpo4g。
您可以在构造函数参数中提供 AnonymousQueue.NamingStrategy 实现。
以下示例展示了如何执行此操作:
@Bean
public Queue anon1() {
return new AnonymousQueue();
}
@Bean
public Queue anon2() {
return new AnonymousQueue(new AnonymousQueue.Base64UrlNamingStrategy("something-"));
}
@Bean
public Queue anon3() {
return new AnonymousQueue(AnonymousQueue.UUIDNamingStrategy.DEFAULT);
}
第一个 bean 生成一个以 spring.gen- 为前缀的队列名称,后跟 UUID 的 Base64 表示形式——例如:spring.gen-MRBv9sqISkuCiPfOYfpo4g。 第二个 bean 生成一个队列名称,前缀为 Something-,后跟 UUID 的 Base64 表示形式。 第三个bean仅使用UUID(无base64转换)生成名称——例如,f20c818a-006b-4416-bf91-643590fedb0e。
Base64 编码使用 RFC 4648 中的“URL 和文件名安全字母表”。删除尾随填充字符 (=)。
您可以提供自己的命名策略,从而可以在队列名称中包含其他信息(例如应用程序名称或客户端主机)。
您可以在使用 XML 配置时指定命名策略。 naming-strategy 属性出现在实现 AnonymousQueue.NamingStrategy 的 bean 引用的 <rabbit:queue> 元素上。 以下示例展示了如何以各种方式指定命名策略:
<rabbit:queue id="uuidAnon" />
<rabbit:queue id="springAnon" naming-strategy="uuidNamer" />
<rabbit:queue id="customAnon" naming-strategy="customNamer" />
<bean id="uuidNamer" class="org.springframework.amqp.core.AnonymousQueue.UUIDNamingStrategy" />
<bean id="customNamer" class="org.springframework.amqp.core.AnonymousQueue.Base64UrlNamingStrategy">
<constructor-arg value="custom.gen-" />
</bean>
第一个示例创建诸如 spring.gen-MRBv9sqISkuCiPfOYfpo4g 之类的名称。 第二个示例使用 UUID 的字符串表示形式创建名称。
第三个示例创建诸如 custom.gen-MRBv9sqISkuCiPfOYfpo4g 之类的名称。
您还可以提供自己的命名策略 bean。
从版本 2.1 开始,声明匿名队列时,参数 Queue.X_QUEUE_LEADER_LOCATOR 默认设置为客户端本地。 这可确保在应用程序连接的节点上声明队列。
您可以在构造实例后调用queue.setLeaderLocator(null) 来恢复到之前的行为。