黑马十次方项目day05-03之直接模式
什么是直接模式
直接模式,就是不走交换器exchange的模式,(底层还是走了交换器,只不过是走的默认的交换器).
当需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式。
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下
文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃
创建队列
在rabbitmq的页面控制台中,选择queues. 按照如下图的选择,创建一个名为firstQueue
的队列.
添加完成后,可以看到如下图所示的队列了.
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
生产者发送消息
在如下的测试包下
创建测试类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的控制台中,可以看到已经有一个消息进来了.
消息的消费者
在如下的包中, 创建消息的消费者
com.tensquare.rabbit.customer
@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主启动类
启动项目后,控制台打印如下,代表接收到了消息.
在rabbitmq的控制台中,可以看到消息变成0了
负载均衡的测试
我使用的idea版本为2018.3.2
首先在如下图中,点击运行配置
勾选右上角的此处, 允许并列运行项目
首先在yml中, 设置端口号为8001,
在消费的方法中, 设置打印语句为"1111直接模式消费消息: "+msg
运行项目,就开启了8001的端口.
接着修改yml文件, 修改端口为8002, 在打印语句中,设置为2222直接模式消费消息,运行项目,开启8002端口.
再修改yml文件,修改端口为8003, 在打印语句中,设置为3333直接模式消费消息,运行项目,开启8003端口.
运行三次测试类中的发送消息的方法
可以看到的现象是, 在三个接收消息的端口中, 分别都接收到了一个消息.
如下面三个图所示
说明rabbitmq的底层,对消息的接收,做了负载均衡,让每一个消息的接收,分别给一个接收者,这样不会让一个接收者一直接收消息.