SpringBoot简单集成RabbitMQ

本文详细介绍如何在SpringBoot项目中集成RabbitMQ,包括添加依赖、配置参数、编写配置类、实现生产者与消费者等功能,以及进行简单测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot简单集成RabbitMQ

1.导入依赖
<!-- RabbitMQ-jar -->
<dependency>
	   <groupId>org.springframework.boot</groupId>
	   <artifactId>spring-boot-starter-amqp</artifactId>
	   <version>1.5.2.RELEASE</version>
</dependency>
2.添加配置文件 application.yml
#RabbitMQ配置信息
spring.rabbitmq.host: (rabbitmq的主机ip)
spring.rabbitmq.port: 5672(默认是5672)
spring.rabbitmq.username: (账号)
spring.rabbitmq.password: (密码)
# 发送确认
spring.rabbitmq.publisher-confirms: true
# 发送回调
spring.rabbitmq.publisher-returns: true
# 消费消息手动删除
spring.rabbitmq.listener.simple.acknowledge-mod: manual
3.编写配置类
@Configuration
public class RabbitConfig {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${spring.rabbitmq.host}")
    private String host;

    @Value("${spring.rabbitmq.port}")
    private int port;

    @Value("${spring.rabbitmq.username}")
    private String username;

    @Value("${spring.rabbitmq.password}")
    private String password;

    @Value("${spring.rabbitmq.publisher-confirms}")
    private boolean  isConfirm;


    //交换机
    public static final String EXCHANGE_A = "my-mq-exchange_A";
    public static final String EXCHANGE_B = "my-mq-exchange_B";

    //队列
    public static final String QUEUE_A = "QUEUE_A";
    public static final String QUEUE_B = "QUEUE_B";

    //路由
    public static final String ROUTINGKEY_A = "spring-boot-routingKey_A";
    public static final String ROUTINGKEY_B = "spring-boot-routingKey_B";

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host,port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost("/");
        connectionFactory.setPublisherConfirms(isConfirm);
        return connectionFactory;
    }

    @Bean(name="tt")
    public RabbitListenerContainerFactory<SimpleMessageListenerContainer> tt(){
        //消息的统一过滤器
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConcurrentConsumers(5);//允许同时消费数量为5
        factory.setMaxConcurrentConsumers(10);//允许同时最大消费数量为10
        factory.setReceiveTimeout(10000L);//10秒
        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);//设置手动提交
        factory.setConnectionFactory(connectionFactory());
        return  factory;
    }


    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    //必须是prototype类型
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        return template;
    }

    /**
     * 创建队列
     * @return
     */
    @Bean
    public Queue queueA() {
        return new Queue(QUEUE_A, true); //队列持久
    }
    @Bean
    public Queue queueB() {
        return new Queue(QUEUE_B, true); //队列持久
    }

    /**
     * 针对消费者配置
     * 1. 设置交换机类型
     * 2. 将队列绑定到交换机
     FanoutExchange: 将消息分发到所有的绑定队列,无routingkey的概念
     HeadersExchange :通过添加属性key-value匹配
     DirectExchange:按照routingkey分发到指定队列
     TopicExchange:多关键字匹配
     */
    @Bean
    public DirectExchange defaultExchange() {
        return new DirectExchange(EXCHANGE_A);
    }
    @Bean
    public DirectExchange defaultExchangeB() {
        return new DirectExchange(EXCHANGE_B);
    }

    /**
     * 将对列绑定到Topic交换器 声明绑定关系
     * @return
     */
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_A);
    }
    @Bean
    public Binding bindingB() {
        return BindingBuilder.bind(queueB()).to(defaultExchangeB()).with(RabbitConfig.ROUTINGKEY_B);
    }
}
4.编写生产者
@Component
public class MsgProducer implements RabbitTemplate.ConfirmCallback{

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    //由于rabbitTemplate的scope属性设置为ConfigurableBeanFactory.SCOPE_PROTOTYPE,所以不能自动注入
    private RabbitTemplate rabbitTemplate;

    /**
     * 构造方法注入rabbitTemplate
     */
    @Autowired
    public MsgProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
        rabbitTemplate.setConfirmCallback(this); //rabbitTemplate如果为单例的话,那回调就是最后设置的内容
    }

    public void sendMsg(String content) {
        CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
        //把消息放入ROUTINGKEY_A对应的队列当中去,对应的是队列A
        this.rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_A, RabbitConfig.ROUTINGKEY_A, content, correlationId);
    }
    public void sendMsgB(String content) {
        CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
        //把消息放入ROUTINGKEY_B对应的队列当中去,对应的是队列B
        this.rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_B, RabbitConfig.ROUTINGKEY_B, content, correlationId);
    }
    /**
     * 回调
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        logger.info(" 回调id:" + correlationData);
        if (ack) {
            logger.info("消息发送成功");
        } else {
            logger.info("消息发送失败:" + cause);
        }
    }
}
5.编写消费者
@Component
public class MsgReceiver  {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @RabbitListener(containerFactory = "tt",queues = RabbitConfig.QUEUE_A)
    @RabbitHandler
    public void process(String content,Channel channel, Message message)throws IOException{
        logger.info("处理器接收处理队列A当中的消息: " + content);
        // 确认收到消息,false只确认当前consumer一个消息收到,true确认所有consumer获得的消息
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

   	@RabbitListener(containerFactory = "tt",queues = RabbitConfig.QUEUE_B)
   	@RabbitHandler
   	public void process2(String content,Channel channel, Message message)throws IOException{
        logger.info("处理器接收处理队列B当中的消息: " + content);
        // 确认收到消息,false只确认当前consumer一个消息收到,true确认所有consumer获得的消息
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

}
6.简单测试
@Controller
@SpringBootApplication
public class KspServiceRabbitMQApplication {

    public static void main(String[] args) {
        SpringApplication.run(KspServiceRabbitMQApplication.class, args);
    }

    @Autowired
    private MsgProducer msgProducer;

    @ResponseBody
    @RequestMapping("test")
    public String test(){
        msgProducer.sendMsg("信息aaaaaaa");
        return "success";
    }

    @ResponseBody
    @RequestMapping("test2")
    public String test2(){
        msgProducer.sendMsgB("信息bbbbbbbbbb");
        return "success";
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值