在上图模型中,有以下概念:
P:生产者,也就是要发送消息的程序
C:消费者,消息接收者,会一直等待消息到来
Queue:消息队列,图中红色部分,可以缓存消息,生产者向其中投递消息,消费者从中获取消息
代码实现
1.创建maven项目
2.引入依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.11.0</version>
</dependency>
3.在web管理界面上建立虚拟主机
4.构建项目目录
5.创建生产者类
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 生产者
*/
public class Provider {
//生产消息
@Test
public void testSendMessage() throws IOException, TimeoutException {
//创建链接mq的链接工厂对象
ConnectionFactory factory = new ConnectionFactory();
//设置连接mq的主机
factory.setHost("mq的主机IP地址");
//设置端口号
factory.setPort(5672);
//设置连接那台虚拟主机
factory.setVirtualHost("/zz");
//设置访问虚拟主机的用户名和密码
factory.setUsername("root");
factory.setPassword("root");
//获取连接对象
Connection connection = factory.newConnection();
//通过链接获取通道对象
Channel channel = connection.createChannel();
//通道绑定对应的消息队列
//参数1:队列名称,不存在会自动创建
//参数2:定义队列是否要持久化 true 持久化队列 false 不持久化
//参数3:是否独占队列(当前队列只允许当前连接使用)
//参数4:是否在消费完成后自动删除队列
//参数5:额外附加参数
channel.queueDeclare("hello",false,false,false,null);
//发布消息
//参数1:交换机名称 参数2:队列名称
//参数3:传递消息的额外设置 参数4:消息的具体内容(需要一个字节数组)
channel.basicPublish("","hello",null,"hello rabbitmq".getBytes());
//关闭通道
channel.close();
//关闭连接
connection.close();
}
}
6.运行测试类,打开mq web管理界面
可以看到有一条消息已经发送成功了
7.开发消费者,创建消费者类
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消费者
*/
public class Customer {
public static void main(String[] args) throws IOException, TimeoutException {
//创建链接mq的链接工厂对象
ConnectionFactory factory = new ConnectionFactory();
//设置连接mq的主机
factory.setHost("mq的主机IP地址");
//设置端口号
factory.setPort(5672);
//设置连接那台虚拟主机
factory.setVirtualHost("/zz");
//设置访问虚拟主机的用户名和密码
factory.setUsername("root");
factory.setPassword("root");
//获取连接对象
Connection connection = factory.newConnection();
//通过链接获取通道对象
Channel channel = connection.createChannel();
//通道绑定对应的消息队列(参数尽量和生产者中的参数保持一致)
//参数1:队列名称,不存在会自动创建
//参数2:定义队列是否要持久化 true 持久化队列 false 不持久化
//参数3:是否独占队列(当前队列只允许当前连接使用)
//参数4:是否在消费完成后自动删除队列
//参数5:额外附加参数
channel.queueDeclare("hello",false,false,false,null);
//消费消息
//参数1:消费哪个消息 队列名称
//参数2:是否开启消息的自动确认机制
//参数3:消费时的回调接口
channel.basicConsume("hello",true,new DefaultConsumer(channel){
//最后一个参数:消息队列中取出消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("打印消息:"+new String(body));
}
});
}
}
8.运行消费者类
控制台打印了消息
web端消息被消费
这种模型适用于登陆或者注册时发短信的功能,比较简单的模型。刚开始学习,生产者和消费者类中会有大量的代码冗余,在后续学习中,会将多余代码提取出来。