RabbitMQ 快速入门(简单模式)
- 注意: 需要开放5672端口
简单模式图片
-
步骤
- 创建工程(生产者、消费者)
- 分别添加依赖
- 编写生产者发布消息
- 编写消费者接受消息
-
一. 创建工程(生产者、消费者)
-
分别添加依赖
<dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.6.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
-
编写生产者发布消息(具体步骤)
ConnectionFactory factory = new ConnectionFactory();
- 设置参数
factory.setHost("192.168.20.146") //设置ip
;
factory.setPort(5672); //设置端口
factory.setUsername("test"); //设置账号
factory.setPassword("test"); //设置密码
factory.setVirtualHost("/test"); //设置虚拟主机
- 创建连接
Connection connection = factory.newConnection();
- 创建Channel(管道)
Channel channel = connection.createChannel();
- 创建队列Queue
channel.queueDeclare("test_queue",true,false,false,null);
- 发送信息
String body = "hello rabbitmq~~";
channel.basicPublish("", "test_queue", null, body.getBytes());
- 释放资源
channel.close();
connection.close();
-
编写生产者发布消息 代码
package com.yang;
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 Producer_HelloWord {
public static void main(String[] args) throws IOException, TimeoutException {
//1.连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2.设置参数
//设置ip
factory.setHost("192.168.20.146");
//设置端口
factory.setPort(5672);
//设置账号
factory.setUsername("test");
//设置密码
factory.setPassword("test");
//设置虚拟主机
factory.setVirtualHost("/test");
//3. 创建连接
Connection connection = factory.newConnection();
//4. 创建Channel(管道)
Channel channel = connection.createChannel();
//5. 创建队列Queue
/*
参数说明:
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
1. queue: 队列名称
2. durable: 是否持久化 (mq重启之后还在)
3. exclusive:
* 是否独占 只能有一个消费者监听这队列
* 当Connection关闭时,是否删除队列
4. autoDelete: 是否自动删除。当没有Consumer时,自动删除掉
5. arguments: 参数
*/
channel.queueDeclare("test_queue",true,false,false,null);
//6. 发送信息
/*
参数说明:
void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException;
1. exchange: 交换机名称。简单模式下交换机会使用默认的 ""
2. routingKey: 路由名称
3. props:配置信息
4. body:发送消息数据
*/
String body = "hello rabbitmq~~";
channel.basicPublish("", "test_queue", null, body.getBytes());
//7. 释放资源
channel.close();
connection.close();
}
}
-
编写消费者发布消息(具体步骤)
- 其实1~4步是一样的,省略
- 第5步可有可无,因为队列只需要创建一次就不会再创建了!
- 第六步接收消息
-
编写生产者发布消息 代码
package com.yang;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer_HelloWord {
public static void main(String[] args) throws IOException, TimeoutException {
//1. 创建工厂
ConnectionFactory factory = new ConnectionFactory();
//2. 设置参数
factory.setHost("192.168.20.146");
factory.setPort(5672);
factory.setUsername("test");
factory.setPassword("test");
factory.setVirtualHost("/test");
//3. 创建连接
Connection connection = factory.newConnection();
//4. 创建channel(管道)
Channel channel = connection.createChannel();
//5.创建队列(可以省略,因为我们在生产者哪里已经创建了,没必要写,因为它只会创建一次)
channel.queueDeclare("test_queue",true,false,false,null);
//6.接受请求
Consumer consumer = new DefaultConsumer(channel){
/**
* 重写回调方法
* @param consumerTag 标识
* @param envelope 获取一些信息,交换机,路由key...
* @param properties 配置信息
* @param body 数据
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("consumerTag:"+consumerTag);
System.out.println("Exchange:"+envelope.getExchange());
System.out.println("RoutingKey:"+envelope.getRoutingKey());
System.out.println("properties:"+properties);
System.out.println("body:"+new String(body));
}
};
/*
basicConsume(String queue, boolean autoAck, Consumer callback)
参数:
1. queue:队列名称
2. autoAck:是否自动确认
3. callback:回调对象
*/
channel.basicConsume("test_queue",true,consumer);
}
}
- 接收到的消息
- 此时我们队列的消息就被消费完了
- 小结
- P:生产者,也就是要发送消息的程序
- C:消费者:消息的接收者,会一直等待消息到来
- queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息
以上就是简单模式的全部内容