黑马十次方项目day05-03之直接模式

什么是直接模式

直接模式,就是不走交换器exchange的模式,(底层还是走了交换器,只不过是走的默认的交换器).
当需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式。
黑马十次方项目day05-03之直接模式
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下
文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃

创建队列

在rabbitmq的页面控制台中,选择queues. 按照如下图的选择,创建一个名为firstQueue的队列.
黑马十次方项目day05-03之直接模式
添加完成后,可以看到如下图所示的队列了.
黑马十次方项目day05-03之直接模式

java代码实现,消息生产者

创建一个maven工程

pom文件中的依赖如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.thc.demo</groupId>
    <artifactId>rabbitmqdemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

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

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

    </dependencies>


</project>


创建yml配置文件

在yml中指定mq的主机

server:
  port: 8888

spring:
  rabbitmq:
    host: 1553.552.24

生产者发送消息

在如下的测试包下
黑马十次方项目day05-03之直接模式
创建测试类com.tensquare.test.ProductTest
编写如下的代码, 进行消息的发送
其中convertAndSend方法的第一个参数为指定了routingkey的值,要与在rabbitmq中建立的队列的名称要对应上,并且当要消费该消息时,也要使用该键值.

package com.tensquare.test;

import com.tensquare.rabbit.RabbitApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * 类名称:ProductTest
 * 类描述:信息的生产者
 *
 * @author: taohongchao
 * 创建时间:2019/1/27 9:59
 * Version 1.0
 */

//使用spring的测试代替junit的测试
@RunWith(SpringRunner.class)
//指定测试程序的入口,springboot没有配置文件,只能指定启动类
@SpringBootTest(classes = RabbitApplication.class)
public class ProductTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @Test
    public void sendMsg(){
        rabbitTemplate.convertAndSend("firstQueue", "直接模式测试");
    }
}

运行sendMsg的测试方法, 运行成功后,在rabbitmq的控制台中,可以看到已经有一个消息进来了.
黑马十次方项目day05-03之直接模式

消息的消费者

在如下的包中, 创建消息的消费者
com.tensquare.rabbit.customer
黑马十次方项目day05-03之直接模式
@RabbitListener注解,代码消息的监听者, 一有消息就进行消息的消费.
并且用queues来指定消费哪个消息.
使用@RabbitHandler来处理接收到的信息, 在方法的形参中, 进行消息的接收.

代码如下

package com.tensquare.rabbit.customer;

import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 类名称:Customer1
 * 类描述:信息的消费者
 *
 * @author: taohongchao
 * 创建时间:2019/1/27 10:16
 * Version 1.0
 */
@Component
@RabbitListener(queues="firstQueue")
public class Customer1 {

    /**
     * 方法名: getMsg
     * 方法描述: 消费消息,并打印信息
     * 修改日期: 2019/1/27 10:36
      * @param msg
     * @return void
     * @author taohongchao
     * @throws
     */
    @RabbitHandler
    public void getMsg(String msg) {
        System.out.println("直接模式消费消息: "+msg);
    }
}

编写完成后, 启动RabbitApplication主启动类
启动项目后,控制台打印如下,代表接收到了消息.
黑马十次方项目day05-03之直接模式
在rabbitmq的控制台中,可以看到消息变成0了
黑马十次方项目day05-03之直接模式

负载均衡的测试

我使用的idea版本为2018.3.2
首先在如下图中,点击运行配置
黑马十次方项目day05-03之直接模式
勾选右上角的此处, 允许并列运行项目
黑马十次方项目day05-03之直接模式
首先在yml中, 设置端口号为8001,
黑马十次方项目day05-03之直接模式
在消费的方法中, 设置打印语句为"1111直接模式消费消息: "+msg
黑马十次方项目day05-03之直接模式
运行项目,就开启了8001的端口.
接着修改yml文件, 修改端口为8002, 在打印语句中,设置为2222直接模式消费消息,运行项目,开启8002端口.
再修改yml文件,修改端口为8003, 在打印语句中,设置为3333直接模式消费消息,运行项目,开启8003端口.

运行三次测试类中的发送消息的方法
黑马十次方项目day05-03之直接模式
可以看到的现象是, 在三个接收消息的端口中, 分别都接收到了一个消息.
如下面三个图所示
黑马十次方项目day05-03之直接模式
黑马十次方项目day05-03之直接模式
黑马十次方项目day05-03之直接模式
说明rabbitmq的底层,对消息的接收,做了负载均衡,让每一个消息的接收,分别给一个接收者,这样不会让一个接收者一直接收消息.