多方法监听器
从 1.5.0 版本开始,你可以在类级别指定 @RabbitListener
注解。
结合新的 @RabbitHandler
注解,这使得单个监听器可以根据传入消息的有效负载类型调用不同的方法。
这最好通过一个例子来描述:
@RabbitListener(id="multi", queues = "someQueue")
@SendTo("my.reply.queue")
public class MultiListenerBean {
@RabbitHandler
public String thing2(Thing2 thing2) {
...
}
@RabbitHandler
public String cat(Cat cat) {
...
}
@RabbitHandler
public String hat(@Header("amqp_receivedRoutingKey") String rk, @Payload Hat hat) {
...
}
@RabbitHandler(isDefault = true)
public String defaultMethod(Object object) {
...
}
}
在这种情况下,如果转换后的有效负载是 Thing2
、Cat
或 Hat
,则会调用各个 @RabbitHandler
方法。
你应当理解,系统必须能够根据有效负载类型识别唯一的方法。
类型检查是针对可分配给单个没有注解或使用 @Payload
注解的参数。
请注意,同样的方法签名适用,如方法级 @RabbitListener
中所讨论的(前面描述过)。
从 2.0.3 版本开始,一个 @RabbitHandler
方法可以被指定为默认方法,如果没有匹配到其他方法,则会调用该方法。
最多只能有一个方法被如此指定。
@RabbitHandler
仅用于在转换后处理消息有效负载,如果你希望接收未转换的原始 Message
对象,你必须在方法上使用 @RabbitListener
,而不是在类上。