跳到主要内容

多方法监听器

DeepSeek V3 中英对照 Multi-method Listeners

从 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) {
...
}

}
java

在这种情况下,如果转换后的负载是 Thing2CatHat 类型,则会调用各个 @RabbitHandler 方法。你应该理解,系统必须能够根据负载类型识别出一个唯一的方法。系统会检查类型是否可以赋值给一个没有注解或带有 @Payload 注解的单个参数。请注意,与方法级别的 @RabbitListener之前讨论过)一样,适用相同的方法签名。

从 2.0.3 版本开始,@RabbitHandler 方法可以指定为默认方法,如果没有匹配到其他方法,则会调用该方法。最多只能指定一个方法为默认方法。

important

@RabbitHandler 仅用于在转换后处理消息的有效载荷,如果你希望接收未转换的原始 Message 对象,必须在方法上使用 @RabbitListener,而不是在类上使用。