一.RabbitMQ的安装和访问
1.在linux虚拟机安装RabbitMQ
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:3.9.9-management
2.启动RabbitMQ
docker start rabbitmq
3.访问 RabbitMQ网页
在自己的浏览器运行http://192.168.130.39:15672/ (192.168.130.39是自己的虚拟机的ip,其他不变。)本机web访问是15672,idea项目访问时5672
rabbitMq没有开机自启动,如果每次退出虚拟机后再进入,需要重新启动它
登陆到首页,默认用户名和默认密码都是guest
4.创建新用户(创建虚拟主机)
然后我们来创建一个新用户(创建虚拟主机)
还要点右边的Admin,然后左下角添加,username和密码随便取
设置admin用户的虚拟主机,/ 表示所有。
状态改变了
二.创建idea的maven项目
1.建立新的maven项目
2.在pom.xml添加依赖
然后我们再来到你要进行操作的项目,然后在它的pom.xml里添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.1.10.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>compile</scope>
</dependency>
</dependencies>
3.创建启动类并添加注解
然后在你的自己建立的启动类里添加@EnableRabbit注解来启动RabbitMQ。
package com;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableRabbit
@SpringBootApplication
public class SpringBootMain {
public static void main(String[] args) {
SpringApplication.run(SpringBootMain.class,args);
}
}
4.修改application.yml
这个可以自己设置,
guest是游客账号,只能在本机访问
5672端口号是项目程序访问的端口,15672是web访问的端口。
spring:
rabbitmq:
host: 192.168.58.39
port: 5672
username: guest
password: guest
5.创建一个test测试类
6.创建一个配置类
package com.jr.config;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyMqConfig {
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
}
二.创建交换机
队列是用来存放消息的。队列可手动(写代码)或者自动创建。
1. 页面创建(不常用)
name自己取,只要不冲突就行。
回去看多了一个自己命名的交换机,说明创建成功。
2.代码创建(常用)
在你之前创建的test测试类RabbitMqTest 写入下面的代码
package com.jr.test;
import com.SpringBootMain;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest(classes = SpringBootMain.class) //SpringBootMain 是SpringBoot项目的启动类
@Slf4j
@SuppressWarnings("all")
@RunWith(SpringRunner.class) //SpringRunner 是依赖中的系统类,如果Test导的是junit包里,需要加@RunWith注解
public class RabbitMqTest {
@Autowired
private AmqpAdmin amqpAdmin;
/**
* String name:交换机名称
* boolean durable:是否持久化
* boolean autoDelete:是否自动删除
*/
@Test
public void createExchange() {
String name = "helloworld";//交换机的名字
boolean durable = true;//允许持久化
boolean autoDelete = false;//不允许自动删除
DirectExchange directExchange = new DirectExchange(name, durable, autoDelete);
amqpAdmin.declareExchange(directExchange);
log.info("create exchanges {}", "hello");//日志信息可写可不写
}
}
2.1启动createExchange方法
再去rabbitMQ网页,发现多了helloworld这个交换机,说明创建成功。
三.创建队列
1. 页面创建(不常用)
name自己取,只要不冲突就行
创建后的结果
2. 代码创建(常用)
在你之前创建的test测试类RabbitMqTest 写入下面的代码
@Test
public void createQueue() {
Queue queue = new Queue("helloworld-queue", true, false, false);
String queueName = amqpAdmin.declareQueue(queue);
log.info("创建队列成功 {}", queueName);
}
2.1启动createQueue方法
再去rabbitMQ网页、发现多了helloworld-queue这个队列,说明创建成功。
四.交换机与队列绑定
将交换机和队列建立关系。也分为页面绑定和代码绑定
1.页面创建(不常用)
点击进入一个交换机。
TO queue 是你要绑定的队列,routing key 随便命名
绑定后会出现下面这个图
2.代码绑定(常用)
在上面创建的test测试类RabbitMqTest 中添加以下代码
/**
* 目的地名字(就是队列的名字)
* 绑定类型,交换机或队列
* 交换机名称
* 路由键
* 参数(很少使用)
*/
@Test
public void createBinding() {
Binding binding = new Binding("helloworld-queue", Binding.DestinationType.QUEUE, "helloworld", "helloworld.queue", null);
amqpAdmin.declareBinding(binding);
log.info("创建绑定成功 {}", "helloworld.queue");
}
启动测试:
再去rabbitMQ网页查看
五.发送消息
1.发送基本数据类型
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 交换机名称
* 路由键
* 内容
*/
@Test
public void sendMessage(){
rabbitTemplate.convertAndSend("helloworld", "helloworld.queue", "hello world !");
}
测试:
Messages那的数字1是查看前几条信息
上面不是常用的发送方式
2.发送对象
我们来发送对象。
2.1创建一个实体类
package com.jr.entry;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Emp {
private int empno;
private String ename;
}
2.创建一个配置类
2.2把下面的代码放入RabbitMqTest 测试类中
/**
* 交换机名称
* 路由键
* 对象
*/
@Test
public void sendObject(){
Emp emp=new Emp();
emp.setEname("奥特曼");
emp.setEmpno(123456);
rabbitTemplate.convertAndSend("helloworld", "helloworld.queue", emp);
log.info("兄弟我来了");
}
2.3启动测试方法
去rabbitMQ网站去看看,准备中(Ready)的消息变成两个了,然后我们点击进入helloworld-queue 队列里
六.接受消息
1.创建一个RabbitMqListener 类
package com.jr.listener;
import com.jr.entry.Emp;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class RabbitMqListener {
@RabbitListener(queues = {"helloworld-queue"})
public void getMessage(Message message, Emp emp) {
System.out.println(emp);
System.out.println(message);
System.out.println(new String(message.getBody()));
}
}
2.启动之前我们那个发送对象的测试方法
这里看自己的控制台,收到了消息
然后再去rabbitMQ网站看看,之前准备的(Ready)的消息全没了。
再次get messages时也弹窗说queue is empty
到此结束,希望能帮到大家