@RabbitListener
是 Spring AMQP 提供的注解,用于简化 RabbitMQ 消息监听器的创建。通过在方法上添加 @RabbitListener
注解,可以将方法注册为消息监听器,用于处理从 RabbitMQ 中接收到的消息。
以下是 @RabbitListener
的使用详解:
1. 基本用法:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class MyListener {
@RabbitListener(queues = "myQueue")
public void handleMessage(String message) {
// 处理接收到的消息
System.out.println("Received message: " + message);
}
}
上面的例子中,handleMessage
方法被 @RabbitListener
注解标记,表示它是一个 RabbitMQ 消息监听器,用于监听名为 "myQueue" 的队列。
2. 多个队列监听:
@RabbitListener(queues = {"queue1", "queue2"})
public void handleMessage(String message) {
// 处理接收到的消息
System.out.println("Received message: " + message);
}
通过在 queues
属性中指定多个队列,可以监听多个队列。
3. 动态队列名:
//此处使用了spl表达式进行解析实现动态队列名
@RabbitListener(queues = "#{dynamicQueue.name}")
public void handleMessage(String message) {
// 处理接收到的消息
System.out.println("Received message: " + message);
}
=============================================================
import org.springframework.stereotype.Component;
@Component
public class DynamicQueue {
private String name = "myDynamicQueue"; // 初始队列名
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在 queues
属性中可以使用 SpEL 表达式动态指定队列的名称。
4. 监听指定交换机和路由键:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "myQueue", durable = "true"),
exchange = @Exchange(value = "myExchange", type = ExchangeTypes.TOPIC),
key = "myRoutingKey")
)
public void handleMessage(String message) {
// 处理接收到的消息
System.out.println("Received message: " + message);
}
通过 bindings
属性可以指定队列、交换机和路由键的绑定关系。
5. 指定容器工厂:
@RabbitListener(containerFactory = "myContainerFactory", queues = "myQueue")
public void handleMessage(String message) {
// 处理接收到的消息
System.out.println("Received message: " + message);
}
通过 containerFactory
属性指定使用的 RabbitListenerContainerFactory
。
6. 确认模式:
@RabbitListener(queues = "myQueue", ackMode = "MANUAL")
public void handleMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
// 处理接收到的消息
System.out.println("Received message: " + message);
// 手动确认消息
channel.basicAck(tag, false);
}
通过设置 ackMode
为 "MANUAL",可以手动确认消息。
7.注解配置项使用解释及示例
这些是 @RabbitListener
注解的配置项,以下是每个配置项的解释以及使用示例:
-
id:
- 说明:用于为监听容器指定一个唯一的标识符。
- 示例:
id = "myListener"
-
containerFactory:
- 说明:指定要使用的
RabbitListenerContainerFactory
的 bean 名称,用于创建监听容器。 - 示例:
containerFactory = "myContainerFactory"
- 说明:指定要使用的
-
queues:
- 说明:指定要监听的队列的名称,可以指定多个队列。
- 示例:
queues = {"queue1", "queue2"}
-
queuesToDeclare:
- 说明:用于声明监听的队列的详细信息,包括队列的名称、是否持久化等。
- 示例:
queuesToDeclare = @Queue(name = "myQueue", durable = "true")
-
exclusive:
- 说明:指定是否使用独占模式。
- 示例:
exclusive = true
-
priority:
- 说明:指定监听容器的消费者线程的优先级。
- 示例:
priority = "high"
-
admin:
- 说明:指定
RabbitAdmin
的 bean 名称,用于进行声明式的队列绑定等操作。
- 示例:
admin = "myRabbitAdmin"
- 说明:指定
-
bindings:
- 说明:用于声明队列和交换机的绑定关系。
- 示例:
bindings = {@QueueBinding(value = @Queue(name = "myQueue"), exchange = @Exchange(name = "myExchange"))}
-
group:
- 说明:用于指定监听容器的组名称。
- 示例:
group = "myGroup"
-
returnExceptions:
- 说明:指定发生异常时的返回策略。
- 示例:
returnExceptions = "java.lang.Exception"
- errorHandler:
- 说明:指定用于处理消息监听异常的错误处理器。
- 示例:
errorHandler = "myErrorHandler"
- concurrency:
- 说明:指定消息监听的并发消费者数量。
- 示例:
concurrency = "3-5"
- autoStartup:
- 说明:指定监听容器是否在启动时自动启动。
- 示例:
autoStartup = "false"
- executor:
- 说明:指定用于执行监听器方法的
TaskExecutor
的 bean 名称。 - 示例:
executor = "myTaskExecutor"
- ackMode:
- 说明:指定消息确认模式。
- 示例:
ackMode = "MANUAL"
- replyPostProcessor:
- 说明:指定用于处理发送回复消息的
MessagePostProcessor
的 bean 名称。 - 示例:
replyPostProcessor = "myReplyPostProcessor"
- messageConverter:
- 说明:指定用于消息转换的
MessageConverter
的 bean 名称。 - 示例:
messageConverter = "myMessageConverter"
- replyContentType:
- 说明:指定回复消息的内容类型。
- 示例:
replyContentType = "application/json"
- converterWinsContentType:
- 说明:指定是否使用转换器定义的内容类型。
- 示例:
converterWinsContentType = "false"