RabbitMQ -- Java 使用RabbitMQ Demo,可自主研深+relang安装教程+Windows RabbitMQ安装教程
背景
最近无聊,研究学习了RabbitMQ(之后简称mq),其实mq很简单,具体的架构图、以及生产者和消费者之间的关系,这里就不在说明了。本帖主要介绍一下windows操作系统下如何安装使用mq,以及用idea+maven+java做的入门级mqDemo。
Erlang安装指南
安装mq之前需要下载Erlang编程语言,具体为什么可自行百度。下载地址:Erlang下载
根据自己电脑情况选择需要下载的版本。下载完成后之间双击打开。
Erlang安装过程
一、打开后之间安装,安装过程比较简单,这里简单过一下。直接点击next。
二、选择安装路径。
三、选择启动文件。直接安装。
四、Erlang安装完成后需要配置环境变量。
- 依次点击: 我的电脑>属性>高级系统设置>环境变量。
在系统变量中新建变量,变量名: ERLANG_HOME ,变量值为你安装Erlang选择的目录。
- 在系统变量Path中添加: %ERLANG_HOME%\bin 。点击确定,完成环境变量配置。
- 确认Erlang是否安装成功。Windows+R键,输入cmd打开。命令行输入: erl -version 或 erl -v ,如下图所示出现版本号即安装成功。
RabbitMQ 安装指南
首先下载RabbitMq安装文件。下载地址:RabbitMQ下载 。
点击Windows下载,下载完成后直接打开。
mq安装过程
一、运行下载后的文件开始安装,安装过程与Erlang类似。直接点击next。
二、选择自己的安装目录点击安装。注意文件夹名称尽量不要带空格。
三、等待安装完成。
四、安装完成后需要激活rabbitmq_management。cmd命令行进入安装目录,进入 rabbitmq_server- 开头的文件夹下的sbin目录中。
输入: rabbitmq-plugins.bat enable rabbitmq_management 。Enter,如图所示出现以下内容即为成功。
五、找到安装后的service -start 文件点击,即可启动RabbitMQ服务。
六、测试。mq有前端ui页面,默认端口15672,默认账户和密码都是:guest。浏览器输入http://localhost:15672 。出现如下页面即说明mq服务启动成功。
java+maven+mq demo演示
idea新建maven项目
一、New Project
二、选择如图所示内容,点击next。
三、设置GroupId和ArtifactId。可以理解为包名和项目名称。点击next。
四、配置Maven仓库,这里就不做配置了。配置成你本地的Maven仓库就好了。点击next。
五、设置项目名称和项目文件所在目录。项目默认和ArtifactId一样。点击Finish。创建完成打开项目即可,下面我直接打开我之前创建的demo项目。
六、配置mq的maven依赖jar。
pom.xml文件的dependencies标签中添加:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
七、接下来就是生产者与消费者了,具体生产者和消费者之间的关系我就不在详细介绍了,一般就是生产者创建和发布消息内容,消费者接收和查看消息内容喽。
- 首先创建生产者:ProducerDemo.java ,在本方法中有一个ConfirmListener,Confirm就是消息确认,ConfirmLisyener就是消息确认监听,大致内容就是当消息成功创建并且发布就会执行监听中的消息成功处理方法handleAck ,发布失败就会执行handleNack 。
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("guest");
connectionFactory.setPassword("guest");
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 。
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("guest");
connectionFactory.setPassword("guest");
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";
//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建立成功。 - 进入mq的UI页面的queues标签栏中 ,可以看到多出一个名为:test_confirm_queue 的消息队列。
点击test_confirm_queue会来到如下页面:
上方红框在有新消息产生时会统计新消息数量,以折线图的形式随时间波动。注意统计的是新产生的消息。当消费者读取消息时,消息条数就会变成0。
下方红框有一个Get messages,点击展开可以获取到mq中的消息内容。可以自行设置要获取的消息条数。
测试一下,这里我们先关闭消费者main方法,因为消费者会自动获取最新消息,所以一旦消息被获取,我们在UI界面就无法看的我们的最新消息了。
运行生产者的main方法。UI界面中可以看到有一条新的消息产生。
点击Get messages中的Get message(s) 。可以看到生产者创建并发布的消息。