java - 在队列声明错误时退出 Spring RabbitMQ 应用程序
问题描述
我的任务是创建一个简单的 Spring RabbitMQ 聊天应用程序。其中一项要求是只有一个具有给定昵称的用户可以同时在线。用户通过他们的队列名称来区分。现在我遇到了捕获队列声明错误的问题。在配置类中,我像这样声明一个队列 bean
@Bean
public Queue privateQueue(String nickname) {
String queueName = "prv." + nickname;
return new Queue(queueName, false, true, true);
}
如果已经存在具有queueName
名称的队列,我想退出整个应用程序并打印出类似“用户名已采用”的内容。最简单的方法是什么?现在应用程序重试创建队列几次,然后AmqpIOException
由于 bean 创建失败而抛出和其他。有没有办法捕捉这些异常?
解决方案
按照设计,声明队列是幂等操作。因此,也许您没有收到错误,因为队列已经存在。
无论如何,您可以使用 RabbitMQ HTTP API 检查队列是否存在。
首先,pom.xml
如果它们不存在,则添加这些依赖项:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>http-client</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
然后你可以做这样的事情:
@Bean
@SneakyThrows
public Queue myQueue(String queueName) {
Client client = new Client(new ClientParameters()
.url("http://127.0.0.1:15672/api/").username("guest").password("guest"));
QueueInfo queue = client.getQueue("/", queueName);
if (queue == null) { // Does it exist?
// Write to log, throw exception and etc'
throw new RuntimeException("Queue " + queueName + " already exists!");
}
return new Queue(queueName, true);
}
推荐阅读
- c# - 当仅在 x 和 z 轴上拖放 3d 对象时,如何让它完全跟随鼠标?
- elasticsearch - 查询以提升作为查询的适当子集的记录或查询是记录的适当子集?
- php - 返回相对于站点根目录的路径,而不是服务器根目录
- c++ - 得到〜在标准输出上没有回应〜在hackerrank问题上
- bash - 使用带有“awk”的函数会产生“致命:无法打开文件”错误
- c - 在 C 中很难将结果相加(For 循环)
- jsf - PrimeFaces 7.0 DataTable 对象 reset() 方法不会清除选定的行
- android - 如何避免 Activity 和 Fragment 中的重复代码?
- c# - 如何让 http 监听器监听前缀而不需要在 url 栏中输入端口?
- python-3.x - 使用 ProcessPoolExecutor 时如何正确记忆?