springboot07-amqpRabbitMQ

Springboot消息中間件

Springboot消息中間件有兩種一種是java提供的API:JMS
另外一種跨語言框架:AMPQ
在這裏插入圖片描述

消息中間件執行原理(AMPQ)

在這裏插入圖片描述

中間件消息模式

  • 點對點:即一個交換器(exchange)對應一個隊列(Queue)
  • 點對面:一個交換器對應多個列表

交換器(exchange)

在這裏插入圖片描述

使用流程

  • 自動配置
  • 1、RabbitAutoConfiguration
  • 2、有自動配置了連接工廠ConnectionFactory;
  • 3、RabbitProperties 封裝了 RabbitMQ的配置
  • 4、 RabbitTemplate :給RabbitMQ發送和接受消息;
  • 5、 AmqpAdmin : RabbitMQ系統管理功能組件;
  •  AmqpAdmin:創建和刪除 Queue,Exchange,Binding
    
  • 6、@EnableRabbit + @RabbitListener 監聽消息隊列的內容

案例

配置文件

spring:
  rabbitmq:
    host: 192.168.1.102
    username: guest
    password: guest

數據轉爲json數據發送

package com.atguigu.amqp.config;

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;

@Configuration
public class MyAMQPConfig {

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

數據監聽類

對數據監聽要對啓動類使用@EnableRabbit //開啓基於註解的rabbitmq

package edu.yjsj.springboot_01_amqp.service;
/**
 * 對rabbitmq監控
 */

import edu.yjsj.springboot_01_amqp.bean.Book;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class BookService {
    @RabbitListener(queues = "yjsj.news")
    public void receive(Book book){
        System.out.println("收到消息!"+book);
    }
}

測試類

package edu.yjsj.springboot_01_amqp;

import edu.yjsj.springboot_01_amqp.bean.Book;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class Springboot01AmqpApplicationTests {
    @Autowired
    RabbitTemplate rabbitTemplate;


    //    單播(點對點)
    @Test
    void contextLoads() {
        Map<String,Object> map = new HashMap<>();
        List message = Arrays.asList("2020/4/16","星期四");
        map.put("data",message);
        rabbitTemplate.convertAndSend("exchange.direct","yjsj.news",map);
    }

    //    單播(點對點)
    @Test
    void contextLoads1() {
        rabbitTemplate.convertAndSend("exchange.direct","yjsj.news",new Book("西遊記","羅貫中"));
    }


    @Test
    void testRabbitMq(){
        Object object = rabbitTemplate.receiveAndConvert("yjsj.news");
        System.out.println(object == null);
        System.out.println(object);
    }

    //    多播(一對多)
    @Test
    void testRabbitMq01(){
        Map<String,Object> map = new HashMap<>();
        List message = Arrays.asList("今天天氣一般");
        map.put("data",message);
        rabbitTemplate.convertAndSend("exchange.fanout","",map);
    }
}

執行結果可以登錄RabbitMQ後臺查看數據結果。

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