docker 安装
## 在线拉取镜像
docker pull rabbitmq
## 安装MQ
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
## 指定用户名 密码 虚拟主机
docker run -it --rm --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --hostname mq1 -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
## 如果无法访问 http://192.168.0.3:15672/
## 进入mq容器
docker exec -it mq bash
## 进入后执行
rabbitmq-plugins enable rabbitmq_management
具体可以参考 https://blog.csdn.net/qq_37242720/article/details/120995380
创建demo
创建设置项目名称和项目文件所在目录。项目默认和ArtifactId一样。点击Finish。创建完成打开项目即可,下面我直接打开我之前创建的demo项目。
pom.xml文件的dependencies标签中添加:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
1.首先创建生产者:ProducerDemo.java ,在本方法中有一个ConfirmListener,Confirm就是消息确认,ConfirmLisyener就是消息确认监听,大致内容就是当消息成功创建并且发布就会执行监听中的消息成功处理方法handleAck ,发布失败就会执行handleNack
package org.example;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmListener;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;
/**
* 生产者
*/
public class ProducerDemo {
public static void main(String[] args) throws IOException, TimeoutException {
//1 创建ConnectionFactory
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/");
//2 获取Connection
Connection connection = connectionFactory.newConnection();
//3 通过Connection创建一个新的Channel
Channel channel = connection.createChannel();
//4 指定我们的消息投递模式: 消息的确认模式
channel.confirmSelect();
String exchangeName = "test_confirm_exchange";
String routingKey = "confirm.save";
//自定义消息内容
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("name", "yxt");
map.put("age", "23");
map.put("sex", "男");
map.put("phone", "0000000");
list.add(map);
//5 发送一条消息
String msg = list.toString();
channel.basicPublish(exchangeName, routingKey, null, msg.getBytes());
//6 添加一个确认监听
channel.addConfirmListener(new ConfirmListener() {
/**
* 消息失败处理
* @param deliveryTag 唯一消息标签
* @param multiple 是否批量
* @throws IOException
*/
@Override
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
System.err.println("-------no!-----------");
}
/**
* 消息成功处理
* @param deliveryTag
* @param multiple
* @throws IOException
*/
@Override
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
System.err.println("-------yes!-----------");
}
});
}
}
创建消费者:ConsumerDemo 。
package org.example;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消费者
*/
public class ConsumerDemo {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
//1 创建ConnectionFactory
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/");
//2 获取Connection
Connection connection = connectionFactory.newConnection();
//3 通过Connection创建一个新的Channel
Channel channel = connection.createChannel();
String exchangeName = "test_confirm_exchange";
String routingKey = "confirm.#";
// String queueName = "test_confirm_queue";
String queueName = "wangmutian";
//4 声明交换机和队列,然后进行绑定设置路由Key
channel.exchangeDeclare(exchangeName, "topic", true);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);
//5 创建消费者
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, true, queueingConsumer);
//6 接收消息
while (true) {
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
String msg = new String(delivery.getBody());
System.err.println("消费端: " + msg);
}
}
}
运行测试,首先运行消费者的main方法,再运行生产者的main方法。显示内容如下:
生产者控制台:
生产者控制台打印
消费者控制台:
消费者控制台打印
至此,demo建立成功。