今天来学习下怎样在Mac上安装和使用RMQ。
一、安装RMQ
网上找教程安装MQ,大致氛围两种安装方式:
- 1、通过wget获取下载RabbitMQ的源文件,解压源文件之后进行安装,前提条件是系统已经安装wget命令。
- 2、通过brew指令来安装,由于在安装wget指令时遇到的问题一直没有解决,本次采用的是通过brew安装RabbtiMQ。
如果您的系统没有安装HomeBrew,则需要先安装,查看是否安装:
brew --version
Homebrew 2.4.3-49-g4290789
Homebrew/homebrew-core (git revision 08af7; last commit 2020-07-05)
Homebrew/homebrew-cask (git revision 927fe; last commit 2020-07-05)
我的系统已经安装过了,则不用再次安装Brew,直接安装RMQ即可。
安装HomeBrew
1、打开安装HomeBrew网址,和一个新的终端,拷贝安装命令到终端。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
2、按下回车键,命令自动执行,命令执行的过程中会提示输入密码,此时输入登录mac系统的账号的密码。当命令执行结束后会出现一下提示:
➜ ~ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Password:
==> You are using macOS 10.11.
==> We (and Apple) do not provide support for this old version.
This installation may not succeed.
After installation, you will encounter build failures with some formulae.
Please create pull requests instead of asking for help on Homebrew\'s GitHub,
Discourse, Twitter or IRC. You are responsible for resolving any issues you
experience while you are running this old version.
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
Press RETURN to continue or any other key to abort
==> Downloading and installing Homebrew...
在执行上述命令的时候,出现了这样的错误:
Failed to connect to raw.githubusercontent.com port 443: Connection refused
在网上查找了下原因,是因为域名被污染了,不可用,所以需要修改hosts
文件:
sudo vim /etc/hosts
# 加上一行
199.232.28.133 raw.githubusercontent.com
安装RMQ
1、brew安装
brew install rabbitmq
因为 rabbitMQ 是基于 erlang 语言开发的,就如同 activemq 需要安装 java 环境一样, 为了使用 rabbitMQ 需要安装 erlang环境,所以,我们可以看到上边的命令显示安装 erlang 语言环境。
如果在安装的时候出现镜像源的问题,则可以将homebrew镜像源切换为国内清华大学或阿里云镜像源,具体操作可以参考这篇文章:解决国内mac无法安装homebrew神器。
2、docker 安装
如果以上不能安装,则可以使用docker安装,docker安装非常简单,只需拉取镜像,因为环境已经都安装好了。
2.1 拉取镜像
docker pull rabbitmq
2.2 启动
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
2.3 查看docker运行
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cbb83a65ca7c rabbitmq:3-management "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbitmq
4.访问
启动镜像之后,浏览器内输入 http://localhost:15672,默认的用户名密码都是guest,登录后可以在Admin那一列菜单内添加自己的用户。
登录之后的界面:
二、RMQ的使用
如何使用,请看该教学文档:RMQ消息队列学习
生产者:TestProducer.java
package cn.how2j;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 消息生成者
*/
public class TestProducer {
public final static String EXCHANGE_NAME="fanout_exchange";
public static void main(String[] args) throws IOException, TimeoutException {
RabbitMQUtil.checkServer();
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RMQ相关
factory.setHost("localhost");
Connection connection = factory.newConnection();
// 创建通道
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
for(int i = 0; i < 100; i++){
String message = "direct 消息" + i;
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
System.out.println("发送消息: " + message);
}
// 关闭通道和连接
channel.close();
connection.close();
}
}
消费者:TestCustomer.java
package cn.how2j;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import cn.hutool.core.util.RandomUtil;
public class TestCustomer {
public final static String EXCHANGE_NAME="fanout_exchange";
public static void main(String[] args) throws IOException, TimeoutException {
//为当前消费者取随机名
final String name = "consumer-"+ RandomUtil.randomString(5);
//判断服务器是否启动
RabbitMQUtil.checkServer();
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置RabbitMQ地址
factory.setHost("localhost");
//创建一个新的连接
Connection connection = factory.newConnection();
//创建一个通道
Channel channel = connection.createChannel();
//交换机声明(参数为:交换机名称;交换机类型)
channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
//获取一个临时队列
String queueName = channel.queueDeclare().getQueue();
//队列与交换机绑定(参数为:队列名称;交换机名称;routingKey忽略)
channel.queueBind(queueName,EXCHANGE_NAME,"");
System.out.println(name +" 等待接受消息");
//DefaultConsumer类实现了Consumer接口,通过传入一个频道,
// 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(name + " 接收到消息 '" + message + "'");
}
};
//自动回复队列应答 -- RabbitMQ中的消息确认机制
channel.basicConsume(queueName, true, consumer);
}
}
先运行两次 TestCustomer,启动两个消费者。
然后运行一次 TestProducer, 启动生产者,生产100条信息。
此时就可以看到如图所示两个消费者都能收到 这100条信息。