zoukankan      html  css  js  c++  java
  • ActiveMQ安装与持久化消息

    activityMQ官网:http://activemq.apache.org/

     有windows版与linux版

     windows版启动

    在bin目录下双击activemq.bat

    linux版的安装与启动

    安装:

    1.首先下载

    参考http://www.cnblogs.com/shihaiming/p/6008319.html

    主要步骤是:

      wget http://apache.fayea.com/activemq/5.14.1/apache-activemq-5.14.1-bin.tar.gz
    tar -xf ./apache-activemq-5.14.1-bin.tar.gz
    cd ./apache-activemq-5.14.1-bin/bin
    ./activemq start

    测试启动成功与否

    ActiveMQ默认监听61616端口,查此端口看看是否成功启动

    netstat -an|grep 61616

    ps -ef |grep activemq

    启动成功后访问

    http://127.0.0.1:8161/admin/

    登录的用户名与密码默认都是admin

    持久化消息

    A:持久化为文件

         这个你装ActiveMQ时默认就是这种,只要你设置消息为持久化就可以了。涉及到的配置和代码有

    <persistenceAdapter>
    <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>

    B:持久化为MySql

         你首先需要把MySql的驱动放到ActiveMQ的Lib目录下,我用的文件名字是:mysql-connector-java-5.1.40.jar

         接下来你修改配置文件

    <persistenceAdapter> 
    <jdbcPersistenceAdapter dataDirectory="${activemq.data}/mysqldb" dataSource="#mysql-ds"/> 
    </persistenceAdapter>

    在网上还看到还有这种配置,我没尝试

    <persistenceAdapter>  
       <jdbcPersistenceAdapter dataDirectory="${activemq.data}/mysqldb" dataSource="#mysql-ds" createTablesOnStartup="false" />
    </persistenceAdapter>

    dataSource指定持久化数据库的bean,createTablesOnStartup是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成false

    在配置文件中的broker节点外增加

    <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/activemq?relaxAutoCommit=true"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    <property name="maxTotal" value="200"/>
    <property name="poolPreparedStatements" value="true"/>
    </bean>

    修改后的效果如下:

    从配置中可以看出数据库的名称是activemq,你需要手动在MySql中增加这个库。

    然后重新启动消息队列,你会发现多了3张表

    1:activemq_acks

    2:activemq_lock

    3:activemq_msgs

    自动建表时activemq_msgs这张表很可能会报错,看到别人写的是要改编码为latin1,但是如果编码不能改的情况下那就手动建这张表吧。建表语句如下:

    CREATE TABLE ACTIVEMQ_ACKS(
    CONTAINER VARCHAR(250) NOT NULL, 
    SUB_DEST VARCHAR(250), 
    CLIENT_ID VARCHAR(250) NOT NULL, 
    SUB_NAME VARCHAR(250) NOT NULL, 
    SELECTOR VARCHAR(250), 
    LAST_ACKED_ID BIGINT, 
    PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME)
    )ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
    

     注意:

        执行建表语句时可能会报下面的错误:

        Specified key was too long; max key length is 767 bytes

    这是因为Mysql的字段设置的太长了,所以在检表语句后面加入:ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

    如何还是报错那就只能把字段的长度改短了。在mysql5.6报错,5.7不报错。

    持久化到mysql后:

    如果是queue,在没有消费者消费的情况下会将消息保存到activemq_msgs表中,只要有任意一个消费者已经消费过了,消费之后这些消息将会立即被删除。

    如果是topic,此时如果还未曾有订阅者曾今订阅过此topic。这个时候就不会有任何记录持久化到表中,因为持久化一个没有订阅者的消息是浪费。

    附上activityMQ的全部建表语句

    DROP TABLE IF EXISTS `activemq_acks`;
    
    CREATE TABLE `activemq_acks` (
      `CONTAINER` varchar(250) NOT NULL,
      `SUB_DEST` varchar(250) DEFAULT NULL,
      `CLIENT_ID` varchar(250) NOT NULL,
      `SUB_NAME` varchar(250) NOT NULL,
      `SELECTOR` varchar(250) DEFAULT NULL,
      `LAST_ACKED_ID` bigint(20) DEFAULT NULL,
      `PRIORITY` bigint(20) NOT NULL DEFAULT '5',
      `XID` varchar(250) DEFAULT NULL,
      PRIMARY KEY (`CONTAINER`,`CLIENT_ID`,`SUB_NAME`,`PRIORITY`),
      KEY `ACTIVEMQ_ACKS_XIDX` (`XID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
    
    
    DROP TABLE IF EXISTS `activemq_lock`;
    
    CREATE TABLE `activemq_lock` (
      `ID` bigint(20) NOT NULL,
      `TIME` bigint(20) DEFAULT NULL,
      `BROKER_NAME` varchar(250) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    DROP TABLE IF EXISTS `activemq_msgs`;
    
    CREATE TABLE `activemq_msgs` (
      `ID` bigint(20) NOT NULL,
      `CONTAINER` varchar(250) DEFAULT NULL,
      `MSGID_PROD` varchar(250) DEFAULT NULL,
      `MSGID_SEQ` bigint(20) DEFAULT NULL,
      `EXPIRATION` bigint(20) DEFAULT NULL,
      `MSG` longblob,
      `PRIORITY` bigint(20) DEFAULT NULL,
      `XID` varchar(250) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      KEY `ACTIVEMQ_MSGS_EIDX` (`EXPIRATION`),
      KEY `ACTIVEMQ_MSGS_PIDX` (`PRIORITY`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 相关阅读:
    51 Nod 1086 多重背包问题(单调队列优化)
    51 Nod 1086 多重背包问题(二进制优化)
    51 Nod 1085 01背包问题
    poj 2559 Largest Rectangle(单调栈)
    51 Nod 1089 最长回文子串(Manacher算法)
    51 Nod N的阶乘的长度 (斯特林近似)
    51 Nod 1134 最长递增子序列(经典问题回顾)
    51 Nod 1020 逆序排列
    PCA-主成分分析(Principal components analysis)
    Python中cPickle
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6015825.html
Copyright © 2011-2022 走看看