- 首先卸载redhat的yum,安装centos6.5的yum
rpm -qa |grep yum
rpm -qa|grep yum|xargs rpm -e --nodeps #(不检查依赖,直接删除rpm包)
#重新安装yum
https://www.cnblogs.com/royfans/p/7249110.html
- 安装elrang
【坑
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
yum install erlang-solutions-1.0-1.noarch.rpm
#使用yum安装erlang原因,erlang还有其余包,使用rpm -ivh 无法安装,yum会自动关联下载其他使用包,方便很多】
【卸载erl】
rpm -qa erlang
yum list | grep erlang
yum remove erlang-*
#rpm安装的erlabg版本为较低,不能使用在3.6.x上,需要使用gz安装
wget https://packages.erlang-solutions.com/erlang/esl-erlang-src/otp_src_17.0.tar.gz
tar -zxvf otp_src_17.0.tar.gz
cd otp_src_17.0
./configure --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe
make && make install
- 测试erlang
[root@localhost ~]# erl -v
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V6.0 (abort with ^G)
1> 32+12.
44
2> halt(). #退出
- 安装rabbitmq
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el6.noarch.rpm
#不适用nodeps 安装会报错
rpm -i --nodeps rabbitmq-server-3.6.15-1.el6.noarch.rpm
cp /usr/share/doc/rabbitmq-server-3.6.15/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
4.1启动rabbitmq服务:
[root@localhost rabbitmq]# service rabbitmq-server start
Starting rabbitmq-server: rmdir: failed to remove `/var/run/rabbitmq’: Directory not empty
FAILED - check /var/log/rabbitmq/startup_{log, _err}
#报错使用,创建软连接
ln -s /usr/local/lib/erlang/bin/erl /usr/bin/erl
4.2 查看rabbitmq状态
service rabbitmq-server status
4.3 开启管理UI(一次即可)
rabbitmq-plugins enable rabbitmq_management
访问http://ip:15672/,使用以下添加的账户登录
4.4用户操作
#添加用户
rabbitmqctl add_user admin 123456
#删除账户
rabbitmqctl delete_user admin
#授权
rabbitmqctl set_permissions -p “/” admin “." ".” “.*”
#角色授权
rabbitmqctl set_user_tags admin administrator
4.5修改配置文件
cd /etc/rabbitmq/
mv rabbitmq.config rabbitmq.config_bak
vi rabbitmq.config
#加入以下配置,具体详细参数见http://www.blogjava.net/qbna350816/archive/2016/08/02/431415.aspx
[{rabbit, [
{loopback_users, []},
{heartbeat,5},
{hipe_compile,true},
{vm_memory_high_watermark_paging_ratio, 0.8},
{vm_memory_high_watermark, 0.6},
{msg_store_credit_disc_bound, {500, 100}},
{disk_free_limit, 500000000}]}].
#说明
4.6重启服务
service rabbitmq-server stop
service rabbitmq-server start
-
nginx映射5672端口
安装nginx时需要指定配置文件
./configure --prefix=/app/nginx --with-http_ssl_module --with-http_stub_status_module --with-stream
make && make install
启动nginx
sbin/nginx
vi nginx.conf #这样5678为对外的nginx映射
#添加stream与http同级
stream {
upstream rabbitmq{
hash $remote_addr consistent;
server 172.20.11.45:5672;
}
server {
listen 5678;
proxy_connect_timeout 60s;
proxy_pass rabbitmq;
}
}
如果防火墙开启,则需要开放tcp端口5678
private static final Logger logger = Logger.getLogger("RabbitMQ");
private static ConnectionFactory factory = null;
private static boolean durable = true;// 消息持久化,如果服务器挂了,不会丢失
private Connection getConn() {
Connection conn = null;
try {
if (factory != null) {
conn = factory.newConnection();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return conn;
}
@Override
public boolean sendMsg(String queue, boolean msgCommand, String msg, Long expireTime) {
Connection conn = getConn();
if (conn == null) {
return false;
}
Channel channel = null;
try {
channel = conn.createChannel();
if(!checkQueue(conn, queue)){//不存在,创建队列
channel.queueDeclare(queue, durable, false, false, null);
}else{
if(channel.consumerCount(queue) > 0){//有消费者才发送消息
BasicProperties bp;
if (expireTime == null) {
bp = MessageProperties.PERSISTENT_TEXT_PLAIN;
} else {
bp = new AMQP.BasicProperties.Builder()// .headers(headers)//头可以设置参数
.expiration(String.valueOf(expireTime))// 设置了一个过期时间
.build();
}
channel.basicPublish("", queue, bp, msg.getBytes());
}
}
return true;
} catch (Exception e) {
logger.error("queue=" + queue + ",msg=" + msg + ",RabbitMQsendMsgException:" + e.getMessage());
} finally {
close(conn, channel);
}
return false;
}
@Override
public boolean sendMsgByGroup( String exchange, List<String> queuelist, boolean msgCommand, String msg, Long expireTime) {
if (queuelist == null || msg == null) {
return false;
}
Connection conn = getConn();
if (conn == null) {
return false;
}
BasicProperties bp;
if (expireTime == null) {
bp = MessageProperties.PERSISTENT_TEXT_PLAIN;
} else {
bp = new AMQP.BasicProperties.Builder()// .headers(headers)//头可以设置参数
.expiration(String.valueOf(expireTime))// 设置了一个过期时间
.build();
}
Channel channel = null;
try {
String routeName = "temp_" + exchange + "_" + queuelist.size();// 临时路由,发送完毕后删除
channel = conn.createChannel();
channel.exchangeDeclare(exchange, BuiltinExchangeType.DIRECT);
List<String> tempQueueList = new ArrayList<>();
for (String queue : queuelist) {
if(!checkQueue(conn, queue)){//不存在,创建队列
channel.queueDeclare(queue, durable, false, false, null);
} else {
if(channel.consumerCount(queue) > 0){//有消费者才发送消息
tempQueueList.add(queue);
channel.queueBind(queue, exchange, routeName);
}
}
}
channel.basicPublish(exchange, routeName, bp, msg.getBytes());
for (String queue : tempQueueList) {
channel.queueUnbind(queue, exchange, routeName);
}
return true;
} catch (Exception e) {
logger.error("queuelist=" + queuelist.size() + ",exchange=" + exchange + ",msg=" + msg
+ ",RabbitMQsendMsgByGroupException:" + e.getMessage());
} finally {
close(conn, channel);
}
return false;
}
private void close(Connection conn, Channel channel) {
if (channel != null) {
try {
channel.close();
} catch (Exception e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
@Override
public boolean getQueueStatus(String queue) {
Connection conn = getConn();
if (conn == null) {
return false;
}
long result = 0;
Channel channel = null;
try {
channel = conn.createChannel();
if(!checkQueue(conn, queue)){//不存在,创建队列
channel.queueDeclare(queue, true, false, false, null);
}
result = channel.consumerCount(queue);
} catch (Exception e) {
logger.error("queue="+queue+",GetEueueException: " + e.getMessage());
}finally{
close(conn, channel);
}
return result > 0 ? true : false;
}
private boolean checkQueue(Connection conn, String queue){
try {
Channel channel = conn.createChannel();
channel.queueDeclarePassive(queue);
try {
channel.close();
} catch (TimeoutException e) {
}
return true;
} catch (IOException e) {
return false;
}
}