ActiveMQ将数据持久化到数据库中,不指定具体的数据库,可以使用任意的数据库


MySQL数据库实例

首先定义一个 mysql-ds 的MySQL数据源,然后在 persistenceAdapter 节点中配置 jdbcPersistenceAdapter,并引用刚才定义的数据源。



配置activemq.xml

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

注释默认的kahaDB,添加jdbc数据源

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



在 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/activemq?relaxAutoCommit=true" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="poolPreparedStatements" value="true"/>
</bean>



在lib下添加mysql的jar包



重新运行,数据库自动生成3张表



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

CONTAINER 消息的Destination
SUB_DEST 如果是使用 Static 集群,这个字段会有集群其他系统的信息
CLIENT_ID 每个订阅者都必须有一个唯一的客户端ID用以区分
SUB_NAME 订阅者名称
SELECTOR 选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可以支持多 AND 和 OR 操作
LAST_ACKED_ID 记录消费过的消息的ID
PRIORITY 优先级,从0-9,数值越大,优先级越高




activemq_lock:在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker



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

ID 自增长的数据库主键
CONTAINER 消息的Destination
MSGID_PROD 发送消息者客户端主键
MSGID_SEQ 发送消息的顺序,MSGID_PROD+MSGID_SEQ可以组成 JMS 的MessageID
EXPIRATION 消息的过期时间,存储是从1970-01-01到现在的毫秒数
MSG 消息本体的Java序列化对象的二进制数据
PRIORITY 优先级,从0-9,数值越大,优先级越高




回到顶部