SpringBoot完美整合RabbitMq(三)一看就懂一寫就會的示例代碼

上面兩篇文章已簡單介紹了rabbitMq的安裝和與其它消息中間件的區別。

詳見:

1.SpringBoot完美整合RabbitMq(一)通過docker安裝rabbitMq

2.SpringBoot完美整合RabbitMq(二)RabbitMq等消息中間件簡介

現在簡單介紹下rabbitMq在SpringBoot中的使用。

一、引入依賴

SpringBoot已經默認整合了rabbitMq自動配置,只需要引入簡單的依賴即可

 <!-- rabbitMq -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
 </dependency>

我的Springboot默認版本2.1.9.RELEASE

二、新增RabbitMqController測試類

  1. 注入RabbitTemplate類, RabbitTemplate是消息發送處理組件。
 @Autowired
 private RabbitTemplate rabbitTemplate;
  1. 新增單播模式的發送和接收方法
 /**
     * 發送rabbitMq消息--單播模式
     *
     * @Author ZHANGCHAO
     * @Date 2020/3/4 17:05
     * @param
     * @retrun void
     **/
    @GetMapping("/send")
    public void sendMqDirect() {
        Map<String,Object> map = new HashMap<>();
        map.put("msg","這是第一條消息");
        map.put("data", Arrays.asList("ggg",123,999L,888d));
//      rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",map);
        GyUser user = new GyUser();
        user.setUserName("臥草啊");
        user.setPassWord("666666");
        user.setAddress("山東省章丘市龍山街道辦");
       rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",user);
    }
 /**
     * 接收rabbitMq消息--單播模式
     *
     * @Author ZHANGCHAO
     * @Date 2020/3/4 17:05
     * @param
     * @retrun void
     **/
    @GetMapping("/receive")
    public ResponseMessage receiveMqDirect() {
        Object object = rabbitTemplate.receiveAndConvert("atguigu.news");
        System.out.println(object.getClass());
        return new ResponseMessage(true,object);
    }
  1. 廣播模式,和單播模式大同小異,不設置路由鍵
 /**
     * 廣播模式
     *
     * @Author ZHANGCHAO
     * @Date 2020/3/5 8:18
     * @param
     * @retrun void
     **/
    @RequestMapping("/sendFanout")
    public void sendMqFanout() {
        GyUser user = new GyUser();
        user.setUserName("李巖劉露啊啊啊");
        user.setPassWord("666666");
        user.setAddress("山東省章丘市");
        rabbitTemplate.convertAndSend("exchange.fanout","",user);
    }

二、rabbitMq的轉換器序列化方式是用的jdk的,可讀性差,換成Jackson。

新建MyRabbitMqConfig配置類,配置MessageConverter類

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @program sweet-dream
 * @description: rabbitMq配置類
 * @author: zhangchao
 * @date: 2020/03/04 20:36
 * @since: 1.0.0
 */
@Configuration
public class MyRabbitMqConfig {

    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

三、application.properties配置rabbitMq的地址、用戶名密碼等信息

## rabbitmq配置 ##
spring.rabbitmq.host=115.188.188.188
spring.rabbitmq.username=root
spring.rabbitmq.password=999999
#端口號可以省略,默認就是5672
spring.rabbitmq.port=5672

四、開啓基於註解的RabbitMQ模式

  1. 在啓動類加上@EnableRabbit,開啓基於註解的RabbitMQ模式
/**
 * sweet-dream啓動類
 *
 * @author ZHANGCHAO
 */
@Slf4j
@EnableRabbit
@EnableTransactionManagement
@SpringBootApplication
@MapperScan({"com.junya.dao","com.junya.mapper"})
public class DreamApplication {

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

}
  1. 注入AmqpAdmin,rabbitMq的管理組件
@Autowired
private AmqpAdmin amqpAdmin;

AmqpAdmin有很多方法,比如創建和移除交換機、隊列、綁定等,下面簡單列舉幾個

/**
     * 創建交換器
     *
     * @Author ZHANGCHAO
     * @Date 2020/3/5 9:32
     * @param
     * @retrun void
     **/
    @GetMapping("/creatExchange")
    public void creatExchange() {
        amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
    }
    /**
     * 創建隊列
     *
     * @Author ZHANGCHAO
     * @Date 2020/3/5 9:32
     * @param
     * @retrun void
     **/
    @GetMapping("/creatQueue")
    public void creatQueue() {
        amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
    }
    /**
     * 創建綁定關係
     *
     * @Author ZHANGCHAO
     * @Date 2020/3/5 9:33
     * @param
     * @retrun void
     **/
    @GetMapping("/creatBinding")
    public void creatBinding() {
        amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,
                "amqpadmin.exchange","amqp.哈哈",null));
    }
  1. 新建RabbitMqService類,加幾個監聽方法
/**
 * rabbitMq相關
 *
 * @author ZHANGCHAO
 * @date 2020/3/5 8:34
 * @since 1.0.0
 */
@Service
public class RabbitMqService {

    @RabbitListener(queues = {"atguigu.news"})
    public void getMsg(GyUser user){
        System.out.println("接收到消息:"+user);
    }

    @RabbitListener(queues = {"atguigu.emps"})
    public void  getMsg1(Message message) {
        System.out.println(message);
        System.out.println(message.getBody());
        System.out.println(message.getMessageProperties());
    }
}

@RabbitListener(queues = {“atguigu.emps”}) 監聽指定的隊列,內部接收數組,可以監聽多個隊列。如果其中隊列接收到消息會執行方法,打印消息。

總結

自動配置

  • 1、RabbitAutoConfiguration

  • 2、有自動配置了連接工廠ConnectionFactory;

  • 3、RabbitProperties 封裝了 RabbitMQ的配置

  • 4、 RabbitTemplate :給RabbitMQ發送和接受消息;

  • 5、 AmqpAdmin : RabbitMQ系統管理功能組件;

    ​ AmqpAdmin:創建和刪除 Queue,Exchange,Binding

  • 6、@EnableRabbit + @RabbitListener 監聽消息隊列的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章