1.介绍
也被成为点对点模式
功能描述:一个生产者 P 发送消息到队列 Q,一个消费者 C 接收.
P 表示为生产者 、C 表示为消费者,红色表示队列。
创建maven项目,导入依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
2.创建连接工具
/**
* 获取rabbitmq连接对象
* @return
*/
public static Connection getConnection() throws IOException, TimeoutException {
//定义一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("127.0.0.1");
//设置服务端口号
factory.setPort(5672);
//设置virtualHost
factory.setVirtualHost("/vhost_admin");
//设置用户名
factory.setUsername("admin");
//设置密码
factory.setPassword("admin");
//获取连接
return factory.newConnection();
}
3.消息生产者
生产者负责创建消息队列并发送消息入列,简单分为5步:
- 获取连接
- 创建通道
- 创建队列声明
- 发送消息
- 关闭队列
/**简单队列
* 生产者
* @Author liuqingsen
* @Date 2020/6/21 14:20
*/
public class Producer {
//队列名称
private static final String QUEUE_NAME = "simple_queue";
public static void main(String[] args) throws IOException, TimeoutException {
//获得mq连接
Connection connection = ConnectionUtil.getConnection();
//从连接创建一个通道
Channel channel = connection.createChannel();
//创建队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
String msg = "我是生产者生产的消息!";
System.out.println("生产者发送消息:" + msg);
//发送消息
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
//关闭通道
channel.close();
connection.close();
}
}
4.消息消费者
消费者实现和生产者实现过程差不多,但是没有关闭连接和通道,是因为要消费者一直等待随时可能发来的消息,大致分为如下3步:
- 获取连接
- 获取通道
- 监听队列
/**
* 消费者
* @Author liuqingsen
* @Date 2020/6/21 14:39
*/
public class Customer {
//队列名称
private static final String QUEUE_NAME = "simple_queue";
public static void main(String[] args) throws IOException, TimeoutException {
//获取连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
Channel channel = connection.createChannel();
//队列声明
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 {
String msgString = new String(body, "UTF-8");
System.out.println("消费者获取消息:" + msgString);
}
};
//监听队列
channel.basicConsume(QUEUE_NAME,true,defaultConsumer);
}
}
5.查看队列
进入队列,查看队列详情
Ready:待消费的消息总数。
Unacked:待应答的消息总数。
Total:总数 Ready+Unacked。
查看消息: