在安装好RabbitMQ的基础之上学习简单的生产消息和消费消息的使用。
1.引入依赖
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.RabbitMQ连接工具类
/**
* @author qx
* @date 2023-04-07
* @Descripion: rabbitmq 连接工具类
*/
public class ConnectionUtil {
/**
* 获取rabbitmq请求连接
*/
public static Connection getConnection(){
ConnectionFactory factory = new ConnectionFactory();
// 连接地址
factory.setHost("127.0.0.1");
// 端口
factory.setPort(5672);
// 用户名
factory.setUsername("guest");
// 密码
factory.setPassword("guest");
// 设置虚拟主机
factory.setVirtualHost("/");
try {
return factory.newConnection();
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
return null;
}
}
3.创建消息生产者
/**
* @author qx
* @date 2023-04-07
* @Descripion: 消息生产者 控制层
*/
@Controller
@RequestMapping("/producer")
public class ProducerController {
private static final String QUEUE_NAME = "queue_helloworld";
@RequestMapping
@ResponseBody
public void createMessage() throws IOException, TimeoutException {
// 获取连接
Connection connection = ConnectionUtil.getConnection();
if (connection == null){
return;
}
// 创建数据传输通道
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
// 发送数据到队列
// 参数1:exchange 交换机 没有就设置为 "" 值就可以了
// 参数2:routingKey 路由的key 现在没有设置key,直接使用队列的名字
// 参数3: BasicProperties 发送数据到队列的时候,是否要带一些参数。 MessageProperties.PERSISTENT_TEXT_PLAIN表示没有带任何参数
// 参数4: body 向队列中发送的消息数据
channel.basicPublish("",QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,"第一个队列消息...".getBytes());
// 关闭通道
channel.close();
// 关闭连接
connection.close();
}
}
4.创建消息消费者
/**
* @author qx
* @date 2023-04-07
* @Descripion: 消费者 控制层
*/
@Controller
@RequestMapping("/consumer")
public class ConsumerController {
private static final String QUEUE_NAME = "queue_helloworld";
@RequestMapping
@ResponseBody
public void receiveMessage() throws IOException {
// 获取连接
Connection connection = ConnectionUtil.getConnection();
if (connection == null){
return;
}
// 创建数据传输通道
Channel channel = connection.createChannel();
// 声明队列
// 参数1:队列的名字
// 参数2:是否持久化 比如现在发送到队列里面的消息,如果没有持久化,重启这个队列后数 据会丢失(false) true:重启之后数据依然在
// 参数3:是否排外 连接关闭之后 这个队列是否自动删除(false:不自动删除) 是否允许其他通道来进行访问这个数据(false:不允许)
// 参数4:是否自动删除 就是当最后一个连接断开的时候,是否自动删除这个队列(false:不删除)
// 参数5:附带参数 声明队列的时候,附带的一些参数
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
// 声明消费者
DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("接收到的消息是:"+new String(body));
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
// 绑定消费者
channel.basicConsume(QUEUE_NAME,false,defaultConsumer);
}
}
5.测试
-
先启动消费者
-
再启动生产者
-
可以看到消费者的控制台打印出 生产者传递的消息