-
目的:系统间解耦、系统间通信
-
特点:
- 基于AMQP协议,由erlang语言开发
- 对数据一致性要求更高
- 在Spring上方便整合
-
Hello World模型
- 发布消息
//创建连接mq的工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置连接RabbitMQ主机
connectionFactory.setHost("***.***.***.***");
//设置端口号
connectionFactory.setPort(1234);
//设置连接哪个虚拟主机
connctionFactory.setVirtualHost("虚拟主机名");
//设置访问虚拟主机的用户名和密码
connectinFactory.setUsername("用户名");
connectionFactory.setPassword("密码");
//获取连接对象
Connection connection = connectionFactory.newConnection();
//获取连接中的通道
Channel channel = connection.createChannel();
//通道绑定对应消息队列(自动创建队列)
/**
* 第一个参数为:队列名
* 第二个参数为:队列是否持久化
* 第三个参数为:是否独占队列(其他连接是否可以使用)
* 第四个参数为:消费完是否自动删除
* 第五个参数为:额外参数
*/
channel.queueDeclare("队列名",false,false,false,null);
//发布消息
channel.basicPublish("交互机名","队列名",null,"消息内容".getBytes());
//关闭通道
channel.close();
//关闭连接
connection.close();
- 接收消息
//创建连接mq的工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置连接RabbitMQ主机
connectionFactory.setHost("***.***.***.***");
//设置端口号
connectionFactory.setPort(1234);
//设置连接哪个虚拟主机
connctionFactory.setVirtualHost("虚拟主机名");
//设置访问虚拟主机的用户名和密码
connectinFactory.setUsername("用户名");
connectionFactory.setPassword("密码");
//获取连接对象
Connection connection = connectionFactory.newConnection();
//获取连接中的通道
Channel channel = connection.createChannel();
//通道绑定对应消息队列(自动创建队列)
/**
* 第一个参数为:队列名
* 第二个参数为:队列是否持久化
* 第三个参数为:是否独占队列(其他连接是否可以使用)
* 第四个参数为:消费完是否自动删除
* 第五个参数为:额外参数
*/
channel.queueDeclare("队列名",false,false,false,null);
//消费消息
channel.basicConsume("队列名", 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, "UTF-8"));
}
});
-
平均消费模型
- 多个消费者之间消息均等(即每个消费者平均分配任务)
-
能者多劳模型
channel.basicConsume
的第二个参数默认为true,意为消费者自动向RabbitMQ确认消息(平均分配)不关心业务是否执行完- 将其第二个参数改为false即可变为能者多劳模型
-
扇出模型(广播)
- 生产者发布一个西欧阿西后所有生产者都能拿到
- 发布消息之前需要创建一个交换机,并用
channel.exchangeDeclare()
替换channel.basicDeclare()
- 同时,队列要换为临时队列
//创建临时队列
String queueName = channel.queueDeclare().getQueue();
//绑定临时队列
channel.queueBind(queueName,"交换机名","路由key");
-
路由模型
- 与广播类似,但不是所有消费者都能消费,只有路由key相同的消费者可以消费
- 设置
channel.basicPublish
的第二个参数