RabbitMq的安装配置

一、Erlang的安装:

http://www.erlang.org/downloads
选择otp18.3
解压erlang到/opt目录下:
解压源文件:tar -xzvf otp_src_18.3.tar.gz
cd /opt/otp_src_18.3/
创建erlang安装目录:mkdir /opt/erlang
配置安装路径编译代码:./configure --prefix=/opt/erlang
如果报No curses library functions found错,安装curses
安装后重新编译代码
执行编译结果:make && make install完成后进入/opt/erlang查看执行结果
配置Erlang环境变量,vi /etc/profile文件,增加下面的环境变量:
export PATH=$PATH:/opt/erlang/bin
使得文件生效 source /etc/profile
至此erlang安装完成
erlang安装包路不能删除,如果觉得路径不对,可以重新安装
验证erlang是否安装成功:erl
退出erl:halt();

二、rabbitMq的安装:

Centos6.5默认不安装xz解压命令
安装mq 至/opt/rabbitmq
Mq安装包默认是xz结尾的,解压xz文件后得到tar文件
xz -d rabbitmq-server-generic-unix-3.6.2.tar.xz
解压文件
Mq文件解压:tar -xvf rabbitmq-server-generic-unix-3.6.2.tar
添加环境变量:export PATH=$PATH:/opt/rabbitmq/rabbitmq_server-3.6.0/sbin
环境变量生效:source /etc/profile
进入sbin 启动服务:./rabbitmq-server -detached
查看服务状态:./rabbitmqctl status
关闭服务:./rabbitmqctl stop

#### 三、rabbitmq的配置及权限 ```java 配置网页插件 首先创建目录,否则可能报错:mkdir /etc/rabbitmq 启用厚爱管理界面插件:./rabbitmq-plugins enable rabbitmq_management 配置linux 端口: 15672 网页管理, 5672 AMQP端口 然后访问http://192.168.10.191:15672 rabbitmq默认会创建guest账号,只能用于localhost登录页面管理员 查看mq用户:rabbitmqctl list_users 查看用户权限:rabbitmqctl list_user_permissions guest 新增用户: rabbitmqctl add_user admin 123456 赋予管理员权限: rabbitmqctl set_user_tags admin administrator rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" ```
#开启后台管理页面
./rabbitmq-plugins enable rabbitmq_management
#添加用户
#./rabbitmqctl add_user 账号 密码
./rabbitmqctl add_user admin admin
#分配用户标签(admin为要赋予administrator权限的刚创建的那个账号的名字)
./rabbitmqctl set_user_tags admin administrator
#设置权限<即开启远程访问>(如果需要远程连接,例如java项目中需要调用mq,则一定要配置,否则无法连接到mq,admin为要赋予远程访问权限的刚创建的那个账号的名字,必须运行着rabbitmq此命令才能执行)
./rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" 

RabbitMQ的用户角色分类:
none、management、policymaker、monitoring、administrator

四、 java工具类

public class RabbitMQUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQUtil.class);
    private static final ConnectionFactory FACTORY = new ConnectionFactory();
    private static final List<Connection> CONNECTIONS = new ArrayList<Connection>();
    private static final int MAX_CONNECTION = 20;

    /**
     * 向指定的消息队列发送消息
     * @param message 消息体
     * @param queue 队列名
     */
    public static void sendMessage(String message, String queue) {
        try {
            // 从队列中获取一个连接
            Connection connection = getConnection();
            // 创建一个MQ的管道
            Channel channel = connection.createChannel();
            // 将管道绑定到一个队列上
            channel.queueDeclare(queue, false, false, false, null);
            // 向指定的队列发送消息
            channel.basicPublish("", queue, null, message.getBytes("UTF-8"));
            // 关闭管道
            channel.close();
            // 将连接放回到队列中
            setConnection(connection);
        } catch (Exception e){
            throw new RuntimeException("RabbitMQ connection fail, send message fail!", e);
        }
    }

    /**
     * 向指定的消息队列取出固定数量的数据
     * @param queue 消息队列名
     * @param count 取出的消息数量
     * @return
     */
    public static List<String> receiveMessages(String queue, int count){
        List<String> list = new ArrayList<String>();
        try {
            // 从队列中获取连接
            Connection connection = getConnection();
            // 创建一个管道
            Channel channel = connection.createChannel();
            // 将管道绑定到队列上
            channel.queueDeclare(queue, false, false, false, null);

            // 向指定的队列中获取数据,通过循环,每次循环获取一条数据,总共循环count次
            QueueingConsumer consumer = new QueueingConsumer(channel);
            channel.basicConsume(queue, false, consumer);
            for (int i = 0; i < count; i++){
                QueueingConsumer.Delivery delivery = consumer.nextDelivery(300);
                if (delivery == null) {
                    break;
                }
                String message = new String(delivery.getBody());
                System.out.println(message);
                list.add(message);
                channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

            }
            // 关闭管道
            channel.close();
            // 将连接放回到队列中
            setConnection(connection);
        } catch (Exception e) {
            LOGGER.error("RabbitMQ connection fail, receive message fail!", e);
        } finally {
            return list;
        }
    }

    /**
     * 从队列中获取连接
     * @return
     */
    public static Connection getConnection(){
        try {
            return getAndSetConnection(true, null);
        } catch (Exception e) {
            throw new RuntimeException("connection MQ fail", e);
        }
    }

    /**
     * 将使用完毕的连接放回到队列中
     * @param connection
     */
    private static void setConnection(Connection connection){
        try {
            getAndSetConnection(false, connection);
        } catch (Exception e) {
            throw new RuntimeException("connection MQ fail", e);
        }
    }

    /**
     * 通过同步锁控制连接队列,根据参数isGet来区分本次调用是从队列中取连接还是存放连接
     * @param isGet 取出或者放回的标记,true表示取连接,false表示放回连接
     * @param connection 取连接:null, 放回连接:具体连接对象
     * @return 取连接时,返回具体连接对象,放回连接时,返回null
     * @throws Exception
     */
    private static synchronized Connection getAndSetConnection(boolean isGet, Connection connection) throws Exception{
        if (isGet){
            // 取连接,如果队列中不存在连接,则新建一个连接
            if (CONNECTIONS.isEmpty()){
                return FACTORY.newConnection();
            }
            Connection newConnection = CONNECTIONS.get(0);

            CONNECTIONS.remove(0);
            if (newConnection.isOpen()) {
                return newConnection;
            }else {
                return FACTORY.newConnection();
            }
        }else {
            // 放回连接,如果队列中的连接数超过了MAX_CONNECTION指定数量的连接,则抛弃该连接
            if (CONNECTIONS.size() < MAX_CONNECTION) {
                CONNECTIONS.add(connection);
            }
            return null;
        }
    }

    public static void initFactory(String host, int port){
        FACTORY.setHost(host);
        FACTORY.setPort(port);
        FACTORY.setUsername("test");
        FACTORY.setPassword("test");
    }
}

部分转自:
作者:garryfu
链接:http://www.cnblogs.com/garryfu/p/7988657.html

猜你喜欢

转载自blog.csdn.net/reee112/article/details/84313832