AMQ方式

基于文件的方式存储,只适用于5.3之前的版本,了解即可

KahaDB存储

kahaDB是5.4之后版本的默认存储方式,以日志形式存储数据,默认存储在kahadb这个目录下,可以通过conf/activemq.xml文件中的<kahaDB directory="${activemq.data}/kahadb"/>来修改存储路径。在这个目录下会生成4个文件:db-.log,db.data,db.redo,lock

在线发送activemq消息_ActiveMQ

db-.log

存储消息内容,默认大小是32M,达到阈值随着数据的增多会变大,数据是顺序写入进去的

db.data

存储了db-.log的索引数据,是B树

db.redo

用于出现故障时消息恢复

lock

锁,获得锁的broker才有权限对kahadb的读写权,用于集群环境下的锁竞争

JDBC存储

这种方式是将数据持久化到数据库中,数据库会自动创建3个表,如下:

activemq_msgs:消息表,存储queue和topic的消息

列名

字段描述

id

自增的主键

container

消息的destination

msgid_prod

消息发送者客户端的主键

msg_seq

发送消息的顺序,msgid_prod+msg_seq可以组成jms的messageid

expiration

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

msg

消息本体的java序列化对象的二进制数据

priority

优先级,从0-9,数值越大优先级越高

xid

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

activemq_acks:订阅消息表,存储持久订阅的信息和最后一个持久订阅接收的消息ID

列名

字段描述

container

消息的destination

sub_dest

如果是使用static集群,这个字段会有集群其他系统的信息

client_id

每个订阅者都必须有一个唯一的客户端id用以区分

sub_name

订阅者名称

selector

选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性and和or操作

last_acked_id

记录消费过的消息的id。

activemq_lock:在集群环境下才有用,确保只有一个Broker可以访问,称为Master Broker

列名

字段描述

id

自增的主键

time

时间

broker_name

当前Master Broker

配置方式

在activemq.xml中添加

<bean id="mysql-cfg" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!-- 如果数据库版本是6.0以上则用com.mysql.cj.jdbc.Driver-->
    <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="maxActive" value="200"/>
    <property name="poolPreparedStatements" value="true"/>
</bean>

修改persistenceAdapter

<persistenceAdapter>
   <!--<kahaDB directory="${activemq.data}/kahadb"/>-->
   <jdbcPersistenceAdapter dataSource="#mysql-cfg" createTablesOnStartup="true" />
</persistenceAdapter>

createTablesOnStartup设置为true是为了在启动的时候创建数据表,默认是true,一般是首次启动设为true,之后改为false

准备以下jar包放到安装文件的lib目录下

commons-pool-1.6.jar commons-dbcp-1.4.jar mysql-connector-java-8.0.27.jar

LevelDB存储

类似于KahaDB,基于文件的本地数据库形式存储,性能高于KahaDB。但官方不再支持或推荐使用。

配置方式

<persistenceAdapter>
 		<!--<kahaDB directory="${activemq.data}/kahadb"/> -->
        <levelDB directory="${activemq.data}/leveldb"/>
 </persistenceAdapter>

Memory存储

基于内存存储,不持久化

配置方式

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" persistent="false" dataDirectory="${activemq.data}">
</broker>

persistent=”false” 表示不持久化

JDBC Message store with ActiveMQ Journal

是基于JDBC的优化,JDBC存储每次操作消息都需要对数据库进行I/O。ActiveMQ Journal使用延迟存储到数据库,当有消息时,先缓存到文件中,消费者消费消息直接从缓存中拿,如果在写入数据前消息被消费了,就不写入到数据库,只将未消费的消息批量写入到数据库。

在线发送activemq消息_ActiveMQ_02

配置方式

注释掉persistenceAdapter,添加以下配置

<persistenceFactory>
	<journalPersistenceAdapterFactory dataSource="#mysql-cfg" dataDirectory="activemqData" />
</persistenceFactory>