2026-06-12 01:53:44
之前的博客中我们可以在spring容器中构建 SimpleMessageListenerContainer 来消费消息,我们也可以使用 @RabbitListener 来消费消息。
定义消息处理器, @RabbitListener 注解标记的方法
应用启动类, @EnableRabbit 启用 @RabbitListener
测试:
控制台打印:
如果发送的消息 content_type 的属性是 text ,那么接收的消息处理方法的参数就必须是 String 类型,如果是 byte[] 类型就会报错。
控制台报错
总结
如果消息属性中没有指定 content_type ,则接收消息的处理方法接收类型是 byte[] ,如果消息属性中指定 content_type为text ,则接收消息的处理方法的参数类型是 String 类型。不管有没有指定 content_type ,处理消息方法的参数类型是Message都不会报错。
步骤
具体的消息处理方法的参数是跟 MessageConverter 转换后的java对象有关。
如果想要设置 MessageConverte r,则需要在 RabbitListenerContainerFactory 的实例中去设置,( setMessageConverter 方法)
获取单一个Header的属性,Header还有其他的一些属性,比如 required , defaultvalue 等属性,顾名思义:
配置文件:
启动类:
定义mq中不存在的 Queue , exchange 和 route key
从上面的我们知道声明必须容器中要有 RabbitAdmin 和 RabbitTemplate 实例
应用启动类
测试验证
控制台打印:
说明自动声明的绑定中的队列被自动默认监听。 @RabbitListener 注解中的 bindings 和 queues 参数不能同时指定,否则会报错。
@RabbitListener 可以标注在类上面,当使用在类上面的时候,需要配合 @RabbitHandler 注解一起使用, @RabbitListener 标注在类上面表示当有收到消息的时候,就交给带有 @RabbitHandler 的方法处理,具体找哪个方法处理,需要跟进 MessageConverter 转换后的java对象。
配置:
处理器方法
应用启动类:
发送不包含content_type属性的消息和content_type属性为text的消息,控制台打印:
@RabbitListener 注解的 containerFactory 属性可以指定一个 RabbitListenerContainerFactory 的bean,默认是找名字为 rabbitListenerContainerFactory 的实例。
当我们将 ConsumerConfig 类中的 RabbitListenerContainerFactory 实例的对象名改掉的时候,发现就会报错。
此时控制台上报错,
此时如果配置一下 @RabbitListener 注解的 containerFactory 属性便不会报错。
我们再去改造一下在 RabbitListenerContainerFactory 实例中定义消息类型转换器
User对象:
在处理器中增加参数是User的方法: