原生API实现生产者消费者
- 创建项目
<?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.icoding</groupId>
<artifactId>springboot-rabbitmq-simple</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 生产者代码
package com.lchtest.rabbitmq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class ProducerTest {
//rabbitmq通讯端口
public static final int PORT=5672;
//rabbitmq服务器ip
public static final String HOST = "192.168.61.130";
// rabbitmq的虚拟机
public static final String VIRTUAL_HOST="/";
// rabbitmq 服务账号和密码
public static final String USERNAME="admin";
public static final String PASSWORD="admin";
public static void main(String[] args) throws Exception {
//1.创建一个连接工厂,并进行配置
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setUsername(USERNAME);
connectionFactory.setPassword(PASSWORD);
connectionFactory.setVirtualHost(VIRTUAL_HOST);
connectionFactory.setPort(PORT);
connectionFactory.setHost(HOST);
// 2.通过工厂创建一个连接对象
Connection connection = connectionFactory.newConnection();
// 2.通过connection创建一个Channel
Channel channel = connection.createChannel();
// 4.通过channel发送数据
for (int i=0; i<10;i++){
String msg = "Hello RabbitMQ!" + i;
/* 参数1: 交换机的名字
参数2: 路由key
参数3: 附属参数
参数4:消息内容
没有交换机的发送,这个时候test001就不是路由key,而是队列queue
* */
channel.basicPublish("", "test001", null, msg.getBytes());
}
// 关闭连接
channel.close();
connection.close();
}
}
- 消费者代码
package com.lchtest.rabbitmq;
import com.rabbitmq.client.*;
import java.io.IOException;
public class ConsumerTest {
//rabbitmq通讯端口
public static final int PORT = 5672;
//rabbitmq服务器ip
public static final String HOST = "192.168.61.130";
// rabbitmq的虚拟机
public static final String VIRTUAL_HOST = "/";
// rabbitmq 服务账号和密码
public static final String USERNAME = "admin";
public static final String PASSWORD = "admin";
public static void main(String[] args) throws Exception {
//1.创建一个连接工厂,并进行配置
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setUsername(USERNAME);
connectionFactory.setPassword(PASSWORD);
connectionFactory.setVirtualHost(VIRTUAL_HOST);
connectionFactory.setPort(PORT);
connectionFactory.setHost(HOST);
// 2.通过工厂创建一个连接对象
Connection connection = connectionFactory.newConnection();
// 3.通过connection创建一个Channel
Channel channel = connection.createChannel();
// 4.接收消息的队列
String queueName = "test001";
/**
* 参数1.队列名称
* 参数2 设置是否持久化
* 参数3 autodelete 是否自动删除队列 最后一个消费者断开连接之后队列是否能自动删除
* 参数4 exclusive 是否排外
* 参数5 arguments 设置队列的一些参数
*/
channel.queueDeclare(queueName, true, false, false, null);
//5 创建消费者 // 参考:https://blog.csdn.net/qq_33002953/article/details/90144178
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body);
System.err.println("消费端: " + msg);
}
};
//6 设置Channel
channel.basicConsume(queueName, true, defaultConsumer);
}
}
启动docker,rabbitmq(参考安装docker和rabbitmq),然后启动消费者,生产者:
IDEA控制台可以看到消费者打印的消息内容了:
查看rabbitmq管理台: 可以看到创建了一个连接,一个信道,一个队列,一个消费者