SpringCloud(七):SpringAMQP

编写:HorinJsor


前言

此文需要掌握MQ基础,安装rubbitMQ:
黑马 p65


一、SpringAMQP是什么?

Spring AMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息。包含两部分,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现。


二、发/收消息操作步骤(简单消息模型)

(此案例是简单消息模型:生产者→消息→队列→消费者)

  • 每条消息只能由一个消费者消费

在这里插入图片描述

1.在父工程中引入spring-amqp的依赖

<!--AMQP依赖,包含RabbitMQ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.在publisher服务(生产者)中编写application.yml,添加mq连接信息:

spring:
  rabbitmq: #配置mq地址
    host: 192.168.150.101 # 主机名
    port: 5672 # 端口,注意分别:15672是页面的端口
    virtual-host: / # 虚拟主机(环境),mq种查看
    username: itcast # 用户名
    password: 123321 # 密码

3.在publisher服务(生产者)中发送消息

@SpringBootTest
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Test
    public void testSimpleQueue() { 
        String queueName = "simple.queue";	//队列名称
        String message = "hello, spring amqp!";
        rabbitTemplate.convertAndSend(queueName, message);
    }
}

4.在consumer服务(消费者)中编写application.yml,添加mq连接信息:

spring:
  rabbitmq:
    host: 192.168.150.101 # 主机名
    port: 5672 # 端口
    virtual-host: / # 虚拟主机 
    username: itcast # 用户名
    password: 123321 # 密码

5.在consumer服务(消费者)中编写消费逻辑

因为是监听器,所以得让整个模块启动起来。

@Component //注入bean,让spring发现
public class SpringRabbitListener {

    @RabbitListener(queues = "simple.queue") //监听器,指定监听消息的队列
    public void listenSimpleQueueMessage(String msg) throws InterruptedException {
        System.out.println("spring 消费者接收到消息 :【" + msg + "】");
    }
}

*6.更改消费者机制

如果有50条消息,2个消费者。那么消息接收量会平均分配。(原本机制是先从队列拿,后处理)
想要改变消费者从队列拿取消息的数量,需要配置:

spring:
  rabbitmq:
    listener:
      simple:
        prefetch: 1  #处理完一条消息,再从队列拿取

Thread.sleep(20); //Java程序休眠20ms


三、发布订阅模式:发/收消息

  • 广播模式,发一次消息,多个消费者接收

![在这里插入图片描述](https://img-blog.csdnimg.cn/242f0be9412443f2abe01778139718d2.png


1.在consumer服务(消费者)声明Exchange、Queue、Binding(将队列绑定至交换机,也可去网页手动)

@Configuration //声明配置类
public class FanoutConfig {
    // 声明FanoutExchange交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("itcast.fanout");
    }
    // 声明第1个队列
    @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout.queue1");
    }
    //绑 定队列1和交换机
    @Bean
    public Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
    	return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }
    //  ... 略, 以相同方式声明第2个队列,并完成绑定
}

2.收:在consumer服务(消费者)监听类种创建消费者

@RabbitListener(queues = "fanout.queue1")
public void listenFanoutQueue1(String msg) {
    System.out.println("消费者1接收到Fanout消息:【" + msg + "】");
}

@RabbitListener(queues = "fanout.queue2") 
public void listenFanoutQueue2(String msg) {
    System.out.println("消费者2接收到Fanout消息:【" + msg + "】");
}

3.发:在publisher服务(生产者)发送消息到FanoutExchange(交换机)

@Test
public void testFanoutExchange() {
    // 队列名称
    String exchangeName = "itcast.fanout";
    // 消息
    String message = "hello, everyone!";
    // 发送消息,参数分别是:交互机名称、RoutingKey(暂时为空)、消息 
    rabbitTemplate.convertAndSend(exchangeName, "", message);
}


四、发布订阅模式扩展方式:DirectExchange的使用

在这里插入图片描述


1.收:在consumer服务(消费者)中,编写消费者方法,分别监听不同队列

//通过监听注解,声明队列、交换机、暗号(key)
@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue1"),
        exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
        key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){
    System.out.println("消费者1接收到Direct消息:【"+msg+"】");
}

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue2"),
    	exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
        key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){
    System.out.println("消费者2接收到Direct消息:【"+msg+"】 ");
}

2.发:在publisher服务发送消息到DirectExchange

@Test
public void testDirectExchange() {
    // 队列名称
    String exchangeName = "itcast.direct";
    // 消息 
    String message = "红色警报!日本乱排核废水,导致海洋生物变异,惊现哥斯拉!";
    // 发送消息,参数依次为:交换机名称,RoutingKey,消息
    rabbitTemplate.convertAndSend(exchangeName, "red", message);
}

更多方式请了解通配符交换机的使用 p75


五、消息转换器(发送消息类型为对象)

1.父工程引入依赖:jackson序列化依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

2.生产者中配置(可以在启动类)

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

3.消费者中:

在这里插入图片描述


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值