Spring AMQP匿名队列AnonymousQueue

一般来说,当您需要唯一命名、独占、自动删除的队列时,我们建议您使用 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) 来恢复到之前的行为。

使用 Spring AMQP 和 Redis 消息队列可以实现分布式系统中的异步通信,提高系统的性能和可靠性。 首先,你需要在 Spring Boot 项目中添加 Spring AMQP 和 Redis 的依赖。在 pom.xml 文件中添加以下依赖: ```xml <dependencies> <!-- Spring AMQP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> ``` 接下来,你需要配置 RabbitMQ 和 Redis 的连接信息。在 application.properties 文件中添加以下配置: ```properties # RabbitMQ spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # Redis spring.redis.host=localhost spring.redis.port=6379 ``` 然后,你需要创建一个 RabbitMQ 的消息队列和一个 Redis 的消息队列。在 Spring Boot 项目中,你可以使用 @Bean 注解来创建这些队列。 ```java @Configuration public class QueueConfiguration { @Bean public Queue rabbitQueue() { return new Queue("rabbit.queue"); } @Bean public RedisQueue redisQueue() { return new RedisQueue("redis.queue"); } } ``` 在上面的代码中,我们创建了一个名为 "rabbit.queue" 的 RabbitMQ 队列和一个名为 "redis.queue" 的 Redis 队列。 接下来,你可以在你的代码中使用 RabbitTemplate 和 RedisTemplate 来发送消息。下面是一个简单的例子: ```java @Service public class MessageService { @Autowired private RabbitTemplate rabbitTemplate; @Autowired private RedisTemplate<String, String> redisTemplate; public void sendMessageToRabbit(String message) { rabbitTemplate.convertAndSend("rabbit.queue", message); } public void sendMessageToRedis(String message) { redisTemplate.convertAndSend("redis.queue", message); } } ``` 在上面的代码中,我们创建了一个 MessageService 类来发送消息。我们使用 rabbitTemplate.convertAndSend 方法来发送消息到 RabbitMQ 队列,使用 redisTemplate.convertAndSend 方法来发送消息到 Redis 队列。 最后,你需要在你的代码中使用 @RabbitListener 和 @RedisQueueListener 注解来接收消息。下面是一个简单的例子: ```java @Service public class MessageService { @Autowired private RabbitTemplate rabbitTemplate; @Autowired private RedisTemplate<String, String> redisTemplate; @RabbitListener(queues = "rabbit.queue") public void receiveMessageFromRabbit(String message) { System.out.println("Received message from RabbitMQ: " + message); } @RedisQueueListener(queues = "redis.queue") public void receiveMessageFromRedis(String message) { System.out.println("Received message from Redis: " + message); } } ``` 在上面的代码中,我们使用 @RabbitListener 注解来监听 RabbitMQ 队列中的消息,使用 @RedisQueueListener 注解来监听 Redis 队列中的消息。 总之,使用 Spring AMQP 和 Redis 消息队列可以方便地实现分布式系统中的异步通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值