Springboot集成RabbitMq

关于RabbitMq的基础概念和它的集中工作模式可以先看一下这篇文章:

RabbitMQ的工作模式及原理

以下是springboot集成rabbitmq的代码,比较简单,就当作是一个笔记吧

首先是pom依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

服务配置

server:
  port:
    8080
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: /
    username: guest
    password: guest
    #超时时间
    connection-timeout: 10000s

接下来是相关的配置类

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {
    //交换机名
    public static final String DIRECT_EXCHANGE = "myexchange";
    //队列名
    public static final String DIRECT_QUEUE = "myqueues";
    //路由键
    public static final String DIRECT_QUEUE_KEY = "routing_key";

    @Bean
    public DirectExchange myDirectExchange() {
        //durable 表示小时是否持久化
        //autoDelete 消息是否自动删除
        DirectExchange directExchange = new DirectExchange(DIRECT_EXCHANGE, true, false);
        return directExchange;
    }


    @Bean
    public Queue myQueue() {
        //exclusive:是否排外的  一般等于true的话用于一个队列只能有一个消费者来消费的场景
        Queue queue = new Queue(DIRECT_QUEUE, true, false, false);
        return queue;
    }

    /**
     * 绑定关系
     * @return
     */
    @Bean
    public Binding myBinder() {
        return BindingBuilder.bind(myQueue()).to(myDirectExchange()).with(DIRECT_QUEUE_KEY);
    }

}

生产者类

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Random;
import java.util.UUID;

@Service
public class MqSendService {

    public static final String DIRECT_EXCHANGE = "myexchange";
    public static final String DIRECT_QUEUE = "myqueues";
    public static final String DIRECT_QUEUE_KEY = "routing_key";

    @Resource
    private RabbitTemplate rabbitTemplate;

    public void sendMsg() {
        Random random = new Random();
        String mes = "消息:" + random.nextInt(10);
        //构建correlationData 唯一标识,可以使用id做特殊处理
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        //开启确认模式
        //rabbitTemplate.setConfirmCallback();
        //开启消息投递监听
        //rabbitTemplate.setReturnCallback();

        rabbitTemplate.convertAndSend(DIRECT_EXCHANGE, DIRECT_QUEUE_KEY, mes, correlationData);
    }
}

消费者

import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import java.io.IOException;


@Component
public class MyConsumer {
    private static final Logger logger = LoggerFactory.getLogger(MyConsumer.class);

    @RabbitListener(queues = {"myqueues"})
    @RabbitHandler
    public void consumerMsg(Message<String> message, Channel channel) throws IOException {

        logger.info("消费消息:{}", message.getPayload());

    }
}

Controller层

import com.wmj.service.MqSendService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;

@RestController
@RequestMapping("/message")
public class ProducerController {
    private Logger logger = LoggerFactory.getLogger(ProducerController.class);

    @Resource
    private MqSendService mqSendService;


    @GetMapping("/sendMsg")
    @ResponseBody
    public String sendMsg() {
        try {
            mqSendService.sendMsg();
        } catch (Exception e) {
            logger.error("发送消息失败", e);
            return "fail";
        }
        return "success";
    }
}

启动服务,调用接口,可以看到随机生成的消息已经被消费者接收到。

curl -X GET http://localhost:8080/message/sendMsg
2022-07-10 11:35:23.758  INFO 6460 --- [ntContainer#0-1] com.wmj.service.MyConsumer               : 消费消息:消息:2
2022-07-10 11:35:23.901  INFO 6460 --- [ntContainer#0-1] com.wmj.service.MyConsumer               : 消费消息:消息:6
2022-07-10 11:35:24.108  INFO 6460 --- [ntContainer#0-1] com.wmj.service.MyConsumer               : 消费消息:消息:7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值