• 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;
  • 相关阅读:
    图片《小美眉》
    redhat基本知识
    Linux 求助。设置分辨率?

    PHP close
    别想一个人承担一切
    java charAt返回char,不是int
    我的计算器
    支付宝面试小贴士
    java string charAt length()疑惑
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6015825.html
Copyright © 2020-2023  润新知