RabbitMQ好文
- Rabbitmq Java Client Api详解
- tohxyblog-博客园-rabbitMQ教程系列
- robertohuang-CSDN-rabbitMQ教程系列
- RabbitMQ 中文文档
- RabbitMQ 能为你做些什么?
- RabbitMQ Quick(快速手册)
- RabbitMQ从入门到精通-CSDN专栏
- RabbitMQ入门教程 For Java
- RabbitMQ 原理介绍及安装部署
- RabbitMQ 技术入门与实战
- RabbitMQ知多少
安装RabbitMQ
Ubuntu
添加RabbitMQ源:
sudo echo "deb http://www.rabbitmq.com/debian testing main" >> /etc/apt/sources.list
将RabbitMQ公钥加入我们的信任密钥列表,避免一些关于unsigned packages的警告。
wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc
更新软件列表,安装rabbitmq-server:
apt-get update
apt-get install rabbitmq-server
rabbitmq的相关目录:
$ find / -name .erlang.cookie
/var/lib/rabbitmq/.erlang.cookie
执行apt-get update之后报错:
W: GPG error: http://www.rabbitmq.com testing InRelease: The following signatures couldn\'t be verified because the public key is not available: NO_PUBKEY 6B73A36E6026DFCA
使用apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6B73A36E6026DFCA解决
启动MQ:
service rabbitmq-server start
发现通过ip:15672还是无法访问,那么,还需要进一步设置,启用RabbitMQWeb管理插件:
rabbitmq-plugins enable rabbitmq_management
然后就可以通过浏览器访问了,当使用guest/guest登陆时,报错,User can only log in via localhost
解决办法:
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
添加用户参考:
- RabbitMQ 3.3.1 can not login with guest/guest
- How to Install RabbitMQ Server on Ubuntu 16.04 & 14.04
CentOS
yum -y install epel-release
yum -y update
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
rabbitmq-plugins enable rabbitmq_management
where -U to update if package is already installed, -v for verbose output, -h to print hash output
坑1:
在执行systemctl start rabbitmq-server.service之后,报错:Failed to start RabbitMQ broker:
原因,在运行systemctl start rabbitmq-server.service之前,我先执行了rabbitmq-plugins enable rabbitmq_management,导致/etc/rabbitmq/下生成了enabled_plugins。解决启动错误,先删除该文件。
此外,启动出错时,还有可能因为防护墙的原因,可以参考此篇文章关闭。
防火墙关闭解决办法:
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --reload
setsebool -P nis_enabled 1
或者粗暴点的办法(不推荐)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 (记得/etc/selinux/config也改成 disable,否则重启就不生效了)
坑2:
rabbitmq服务总算start成功了,但是执行rabbitmq-plugins enable rabbitmq_management还是报错:
[root@SHA1000154085 rabbitmq]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
amqp_client
cowlib
cowboy
rabbitmq_web_dispatch
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@SHA1000154085... failed.
Error: {cannot_read_enabled_plugins_file,"/etc/rabbitmq/enabled_plugins",
eacces}
网上看到一篇文章,抱着绝望的心情执行了:
umask 0022; rabbitmq-plugins enable rabbitmq_management
竟然OK了!!!
坑3:
报错:"Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only"
解决办法-unable to start rabbitmq server on ubuntu 10.04:
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie
看来.erlang.cookie的属组也很关键,修改好之后是这样的:
-rw------- 1 rabbitmq rabbitmq 20 Jun 14 14:31 .erlang.cookie
安装参考
- stackoverflow-How to install Install rabbitmq server on centos7
- How to Install RabbitMQ Server on CentOS 7
- RabbitMQ 基础
- how-to-install-rabbitmq-on-centos-7
- How to Install RabbitMQ on CentOS/RHEL 7/6 and Fedora
RabbitMQ集群
修改hostname
临时修改hostname:hostname <new hostname>
推荐永久修改的方式:
CentOS系
$vi /etc/sysconfig/network
HOSTNAME=yourhostname
Debian发行版的hostname的配置文件是/etc/hostname。
Ubuntu
vi /etc/hostname
还需要修改hosts:
$vi /etc/hosts
127.0.0.1 node2
127.0.0.1 localhost node2 localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
最后reboot重启,输入hostname查看是否生效。
参考:
文件路径
[root@SHA1000154085 rabbitmq]# find / -name rabbitmq-server
/usr/lib/ocf/resource.d/rabbitmq/rabbitmq-server
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.10/sbin/rabbitmq-server
/usr/lib/rabbitmq/bin/rabbitmq-server
/usr/sbin/rabbitmq-server
/etc/logrotate.d/rabbitmq-server
重要方法
factory.setAutomaticRecoveryEnabled()
//默认rabbitmq client是打开了自动recover连接的能力的(5.0版本的rabbitmq 默认是打开的)
factory.setAutomaticRecoveryEnabled(true);
ExecutorService es = Executors.newFixedThreadPool(20);
return factory.newConnection(es);
channel.basicQos()
channel.basicQos(1); // accept only one unack-ed message at a time (see below)
参考-重要方法
MQ的消息持久化
https://www.rabbitmq.com/tuto...
When RabbitMQ quits or crashes it will forget the queues and messages unless you tell it not to. Two things are required to make sure that messages aren\'t lost: we need to mark both the queue and messages as durable.
First, we need to make sure that RabbitMQ will never lose our queue. In order to do so, we need to declare it as durable:
首先,我们先保证MQ从不会丢弃我们的队列。为了这样,需要声明它为持久化的:
boolean durable = true;
channel.queueDeclare("task_queue", durable, false, false, null);
This queueDeclare change needs to be applied to both the producer and consumer code.
这个声明需要应用在生产者和消费者两处。
At this point we\'re sure that the task_queue queue won\'t be lost even if RabbitMQ restarts. Now we need to mark our messages as persistent - by setting MessageProperties (which implements BasicProperties) to the value PERSISTENT_TEXT_PLAIN.
我们确保任务队列即使MQ重启也不回丢失。现在,我们需要标记我们的消息为持久化的——通过设置MessageProperties为PERSISTENT_TEXT_PLAIN。
import com.rabbitmq.client.MessageProperties;
channel.basicPublish("", "task_queue",
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
Note:
上面的这个方法是正确的,当在我们的例子中也无法持久化!因为已经定义的队列,再次定义是无效的,这就是幂次原理。RabbitMQ不允许重新定义一个已有的队列信息,也就是说不允许修改已经存在的队列的参数。如果你非要这样做,只会返回异常。
咋整?
一个快速有效的方法就是重新声明另一个名称的队列,不过这需要修改生产者和消费者的代码,所以,在开发时,最好是将队列名称放到配置文件中。
这时,即使RabbitMQ服务器重启,新队列中的消息也不会丢失。
原文地址:https://segmentfault.com/a/1190000015293217