ActiveMq持久化数据的方式

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,怕的是挂掉之后把信息给丢了,怎么办,可以进行消息的持久化,ActiveMQ提供了几种持久化方式。

一、AMQ(基于文件存储的方式)

    它具有写入速度快和容易恢复的特点。消息存储在一个个文件中,文件的默认大小为32M,如果一条消息的大小超过了32M,那么这个值必须设置大一点。当一个存储文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清除阶段,这个文件被删除。不过,AMQ适用于ActiveMQ5.3之前的版本。所以在这里就不过多介绍了。

二、KahaDB(ActiveMq默认的存储方式)

    KahaDB消息存储-提供了容量的提升和恢复能力,是现在的默认存储方式;KahaDB是基于文件的本地数据库储存形式,虽然没有AMQ的速度快,但是它具有强扩展性,恢复的时间比AMQ短,从5.4版本之后KahaDB做为默认的持久化方式。

三、JDBC(基于关系型数据库)

下面介绍一下,如何配置关系型数据库,以mysql为例

1、修改conf下的activemq.xml配置文件

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

修改为:

<persistenceAdapter>
       <jdbcPersistenceAdapter dataSource="#mysql-ds "/>
</persistenceAdapter>

2、然后在</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://127.0.0.1:3306/activemq666? 
          relaxAutoCommit=true&amp;useUnicode=true&amp;characterEncoding=utf- 
          8&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="1q2w3e4r"/>
        <property name="poolPreparedStatements" value="true"/>
    </bean>

其中?relaxAutoCommit=true必须有,其他的属性根据数据库的配置自行决定。

3、将mysql-connector-java-5.1.34-bin.jar(版本可以自行选择)放到ActiveMQ的/ lib目录下。

4、创建activemq666数据库

5、启动activeMq服务,会自动在activemq666中创建三张表

ACTIVEMQ_ACKS表

用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存

序号字段说明
1CONTAINER

消息的destination

2SUB_DEST如果是使用static集群,这个字段会有集群其他系统的信息
3CLIENT_ID每个订阅者都必须有一个唯一的客户端id用以区分
4SUB_NAME订阅者名称
5SELECTOR选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性and和or操作
6LAST_ACKED_ID记录消费过的消息的id

ACTIVEMQ_LOCK表

在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker,其他的只能作为备份等待Master Broker不可用,才可能成为下一个Master Broker。这个表用于记录哪个Broker是当前的Master Broker。

ACTIVEMQ_MSGS表

用于存储消息,Queue和Topic都存储在这个表中。

序号字段说明
1ID自增的数据库主键
2CONTAINER消息的destination
3MSGID_PROD

息发送者客户端的主键

4MSGID_SEQ是发送消息的顺序,msgid_prod+msg_seq可以组成jms的messageid
5EXPIRATION

消息的过期时间,存储的是从1970-01-01到现在的毫秒数

6MSG消息本体的java序列化对象的二进制数据
7PRIORITY优先级,从0-9,数值越大优先级越高

四、Memory(基于内存的存储方式)

    由于内存不属于持久化范畴。所以内存存储不在讨论范围内。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值