消息中间件RabbitMQ-直接模式(Direct)
直接模式(Direct)
什么是Direct模式
我们需要将消息发给唯一一个个节点时使用这种模式,这是最简单的一种形式。
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1)一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)。
2)这种模式下不需要将Exchange进行任何绑定(binding)操作;
3)消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字;
4)如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃;
创建队列
做下面的例子前,我们先建立一个叫malasong的队列。
说明:
1)Durability:
1.1)是否做持久化 Durable(持久)
1.2)transient(临时)
2)Auto delete : 是否自动删除;
代码实现
消息生产者
(1)创建工程rabbitmq_demo,引入amqp起步依赖 ,pom.xml如下:
<?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">
<parent>
<artifactId>tensquare_parent84</artifactId>
<groupId>com.tensquare</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>rabbitmq_demo</artifactId>
<name>rabbitmq_demo</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.17.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.0.1.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
(2)编写配置文件application.yml
server:
port: 9201
spring:
rabbitmq:
host: 192.168.2.10
(3)编写启动类
package com.tensquare;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApplicationDirect {
public static void main( String[] args ) {
SpringApplication.run(Application.class);
}
}
(4)编写测试类
package com.tensquare;
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;
@RunWith(SpringRunner.class)
@SpringBootTest(classes=ApplicationDirect.class)
public class MqTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSend() {
rabbitTemplate.convertAndSend("malasong","我要红包");
}
}
运行测试方法
消息消费者
(1)编写消息消费者类
package com.tensquare;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues="malasong")
public class Customer1 {
@RabbitHandler
public void showMessage(String message){
System.out.println("malasong接收到消息:"+message);
}
}
(2)运行启动类,可以在控制台看到刚才发送的消息
测试
开启多个消费者工程,测试运行消息生产者工程,会发现只有一个消费者工程可以接收到消息。
如何在IDEA中多次启动同一个程序呢?
(1)选择IDEA右上角的类名称按钮;
(2)选择Edit Configurations;
(3)在弹出窗口中选中Allow running in Parallel模式 ,点击OK;
(4)每次运行前修改application.yml,指定不同的端口
server:
port: 9202
运行后在控制台可以看到多个窗口;
说明:
1)会发现只有一个消费者工程可以接收到消息;