P:消息的生产者
红色:消息队列
C:消费者
三个对象: 生产者 队列(RabbitMq) 消费者
2.1 maven依赖
<?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.dada</groupId>
<artifactId>RabbitMQ</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</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>
</dependencies>
</project>
2.2 获取MQ的连接
/**
* 连接工厂
*/
public class ConnectionUtil {
/**
* 获取Mq的连接
* @return
* @throws IOException
* @throws TimeoutException
*/
public static Connection getConnection() throws IOException, TimeoutException {
// 定义一个连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
// 设置服务地址
connectionFactory.setHost("127.0.0.1");
// 设置端口号
connectionFactory.setPort(5672);
// 设置数据库 Vhost
connectionFactory.setVirtualHost("/vhostnew");
// 设置用户名密码
connectionFactory.setUsername("dada");
connectionFactory.setPassword("dada");
// 获取连接
Connection connection = connectionFactory.newConnection();
return connection;
}
}
2.3 生产者
/**
* 生产者
*/
public class Send {
private static final String Queue_name = "test_simple_queque";
public static void main(String[] args) throws Exception {
// 获取一个连接
Connection connection = ConnectionUtil.getConnection();
// 从连接中获取一个通道
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(Queue_name,false,false,false,null);
// 发送的消息
String msg= "hello Simple";
// 发送
channel.basicPublish("",Queue_name,null,msg.getBytes());
System.out.println("----send msg:" + msg);
//关闭连接
channel.close();
connection.close();
}
}
2.4 消费者
/**
* 消费者消费消息
*/
public class Recv {
private static final String Queue_name = "test_simple_queque";
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 consumer = new DefaultConsumer(channel) {
/**
* 一旦有消息进入队列 就会触发这个方法
* @param consumerTag
* @param envelope
* @param properties
* @param body 数据
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body);
System.out.println(msg);
}
};
// 监听队列
channel.basicConsume(Queue_name,consumer);
}
}
2.5 简单队列的不足
耦合性高:生产者一一对应消费者(如果有多个消费者消费队列中的消息,这时候就不行了)队列名变更,这时候得同时变更