最近遇到一个问题,我的@RabbitListener注解失效了,原因是底层组件原因
@SpringBootApplication(exclude = org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.class)
在排除掉自动配置之后,在代码里声明queue和exchange其实是不会自动被创建的,需要自己写一个config类,进行rabbit配置
package org.jeecgframework.boot.conf;
import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
private static String QUEUE_NAME = "my_queue";
private static String OTHER_QUEUE_NAME = "you_queue";
// 自定义监听者
@Resource
private MessageListener messageListener;
// 自定义多个监听者
@Resource
private OtherMessageListener otherMessageListener;
// 配置链接工厂
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
return connectionFactory;
}
/*
* 配置监听器,此时的@RabbitListener是无法生效的,只能自己创建一个监听者
*/
@Bean
public SimpleMessageListenerContainer listenerContainer(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory);
listenerContainer.setQueueNames(QUEUE_NAME);
listenerContainer.setExclusive(false);
listenerContainer.setMessageListener(messageListener);
return listenerContainer;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
// 可以自动创建queue和exchange
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
// 配置多个监听者
@Bean
public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory);
listenerContainer.setQueueNames(OTHER_QUEUE_NAME);
listenerContainer.setExclusive(false);
listenerContainer.setMessageListener(otherMessageListener);
return listenerContainer;
}
}
// 配置template
@Bean
public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
return rabbitTemplate;
}
这样的话,消费者就会正常消费了