RabbitMQ(21.12.30)

118 阅读2分钟

什么是消息队列

我们可以简单理解消息队列就是将需要传输的数据存放在队列中。 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。 其主要用途:不同进程Process线程Thread之间通信。 不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;

目前市面上的消息队列有很多,例如:Kafka、RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ等。

不同MQ的特点

image.png

RabbitMQ

RabbitMQ的简介

AMQP

AMQP是消息队列的一个协议。

image.png 生产者将消息发送到服务的的虚拟主机内的交换机 交换机将消息通过特定规则放入特定的消息队列 消息队列再将消息发送给消费者 (Kafka是消费者去消息队列去读取消息)

image.png

RabbitMQ支持的消息模型

image.png

image.png

RabbitMQ整和SpringBoot

引入依赖

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

配置连接信息

#rabbitmq
spring.rabbitmq.addresses=172.28.5.134
spring.rabbitmq.port=5674
spring.rabbitmq.username=ems
spring.rabbitmq.password=123
spring.rabbitmq.virtual-host=/test

生产者 生产消息


@SpringBootTest(classes = RabbitMqSpringbootApplication.class)
@RunWith(SpringRunner.class)
public class TestRabbitMQ {

    // 注入RabbitMQTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    // helloWorld
    @Test
    public void testHello(){
        rabbitTemplate.convertAndSend("hello","hello world");
    }

    // worker
    @Test
    public void  testWorker(){
        rabbitTemplate.convertAndSend("work","work模型");
    }

    // fanout 广播
    @Test
    public void testFanout(){
        rabbitTemplate.convertAndSend("logs","","fanout消息模型");
    }

    // router
    @Test
    public void testRouter(){
        rabbitTemplate.convertAndSend("directs","info","发送direct信息");
    }

    // topic
    @Test
    public void testTopic(){
        rabbitTemplate.convertAndSend("topictip","user.save","发送topic信息");
    }


}

消费者消费消息

hello模型

@RabbitListener(queuesToDeclare = @Queue("hello"))
public class Consumer {
    @RabbitHandler
    public void  receiver(String message){
        System.out.println(message);
    }
}

fanout模型

public class FanoutConsumer {
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(value = "logs",type = "fanout")// 指定交换机和类型
            )
    })
    public void receiver1(String message){
        System.out.println("consumer1===>"+message);
    }

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue,
                    exchange = @Exchange(value = "logs",type = "fanout")
            )
    })
    public void receiver2(String message){
        System.out.println("consumer2===>"+message);
    }
}

topic模型


public class TopicConsumer {
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(name = "topictip",type = "topic"),  // 指定交换机和类型
                    key = {"*.save"}
            )
    })
    public void receiver1(String message){
        System.out.println("consumer1===>"+message);
    }

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(name = "topictip",type = "topic"),  // 指定交换机和类型
                    key = {"user.*","user.save"}
            )
    })
    public void receiver2(String message){
        System.out.println("consumer2===>"+message);
    }
}

router模型


public class RouterConsumer {

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(value = "directs",type = "direct"),  // 指定交换机和类型
                    key = {"info","error","warn"}
            )
    })
    public void receiver1(String message){
        System.out.println("consumer1===>"+message);
    }

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(value = "directs",type = "direct"),  // 指定交换机和类型
                    key = {"info"}
            )
    })
    public void receiver2(String message){
        System.out.println("consumer2===>"+message);
    }
}

具体Demo请参考github.com/huangrw/Rab…