RabbitMQ入门

AMQP

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)

是进程之间传递异步消息的网络协议。

AMQP工作过程

发布者(Publisher)发布消息(Message),经过交换机(Exchange),交换机根据路由规则将收到消息分发给交换机绑定的队列(Queue),最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

RabbitMQ入门_第1张图片

RabbitMQ介绍

RabbitMQ是由Erlang语言编写的基于AMQP的消息中间件。而消息中间件作为分布式系统重要组件之一,可以解决应用耦合,异步消息,流量削峰等问题。

原理

RabbitMQ入门_第2张图片

 

exchange种类

direct

direct交换器是RabbitMQ默认交换器。默认会进行公平调度。所有接受者依次从消息队列中获取值。Publisher给哪个队列发消息,就一定是给哪个队列发送消息。对交换器绑定的其他队列没有任何影响。

AmqpTemplate:操作RabbitMQ的接口。负责发送或接收消息

@RabbitListener(queues = "") 注解某个方法为接收消息方法

发送消息

    @Autowired
    private AmqpTemplate amqpTemplate;

    @Test
    public void test(){
        amqpTemplate.convertAndSend("myqueue","这是内容1");
        System.out.println("发送成功");
    }

接收消息

@Component
public class DemoReceive {

    @RabbitListener(queues = "myqueue")
    public void demo(String msg){
        System.out.println("获取到的消息1111:"+msg);
    }

    @RabbitListener(queues = "myqueue")
    public void demo2(String msg){
        System.out.println("获取到的消息2222:"+msg);
    }
}

fanout

扇形交换器,实际上做的事情就是广播,fanout会把消息发送给所有的绑定在当前交换器上的队列。且每个队列消息中第一个Consumer能收到消息。

FanoutExchange:fanout交换器

Binding:绑定交换器和队列

BindingBuilder:Binding的构建器

amq.fanout:内置fanout交换器名称

配置

@Bean
protected Queue fanoutQuque1(){
    return new Queue("fanout1");
}

@Bean
protected Queue fanoutQuque2(){
    return new Queue("fanout2");
}

@Bean
protected FanoutExchange fanoutExchange(){
    return new FanoutExchange("amq.fanout");
}

@Bean
protected Binding fanoutBinding(Queue fanoutQuque1,FanoutExchange fanoutExchange){
    return BindingBuilder.bind(fanoutQuque1).to(fanoutExchange);
}

@Bean
protected Binding fanoutBinding2(Queue fanoutQuque2,FanoutExchange fanoutExchange){
    return BindingBuilder.bind(fanoutQuque2).to(fanoutExchange);
}

发送消息

第二个参数routingKey对于fanout没有意义的

@Test
public void test2(){
    amqpTemplate.convertAndSend("amq.fanout","asdfadsf","fanout msg");
    System.out.println("发送成功");
}

接收消息同direct

topic

允许在路由键(RoutingKey)中出现匹配规则。

路由键的写法和包写法相同。com.msb.xxxx.xxx格式。

在绑定时可以带有下面特殊符号,中间可以出现:

* : 代表一个单词(两个.之间内容)

# : 0个或多个字符

接收方依然是公平调度,同一个队列中内容轮换获取值。

TopicExchange:Topic交换器

amq.topic:内置topic交换器名称

配置

@Bean
protected Queue topicQueue() {
    return new Queue("topic1");
}

@Bean
protected Queue topicQueue2() {
    return new Queue("topic2");
}

@Bean
protected TopicExchange topicExchange() {
    return new TopicExchange("amq.topic");
}

@Bean
protected Binding topicBinding(Queue topicQueue, TopicExchange topicExchange) {
    return BindingBuilder.bind(topicQueue).to(topicExchange).with("com.a");
}

@Bean
protected Binding topicBinding2(Queue topicQueue2, TopicExchange topicExchange) {
    return BindingBuilder.bind(topicQueue2).to(topicExchange).with("com.#");
}

发送消息

第二个参数为路由键,匹配配置类中绑定时的路由规则。

@Test
public void test3(){
    amqpTemplate.convertAndSend("amq.topic","com.bjsxt.a.b","topic msg");
    System.out.println("发送成功");
}

 

你可能感兴趣的:(rabbitmq)