- jdbc数据库持久化方式。
- 首先需要把MySql的驱动放到ActiveMQ的Lib目录下,我用的文件名字是:mysql-connector-java-5.1.30-bin.jar
- activemq将数据持久化到数据库中,不指定具体的数据库,可以使用任意的数据库中,本环节使用mysql数据库。
- 下述配置都在activemq.xml中配置,
首先定义一个mysql-ds的mysql数据源,该bean直接配置到activemq.xml的beans节点下,broker节点外。
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.36.136:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root123"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean> - 在broker节点的配置persitenceAdapter节点中配置jdbcPersistenceAdapter并且引用刚才定义的数据源。
dataSource指定持久化数据的bean,createTablesOnStartup是否在启动的时候创建数据表,默认值为true,
这样每次启动都话去创建数据库表了,一般是第一次启动的时候设置为true,之后改成false.
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
</persistenceAdapter> - 然后重新启动activemq. bin/activemq start
- 启动完成后会在数据库创建3个表,分别是activemq_msgs,activemq_acks,activemq_lock表其中
- activemq_msg用于存储消息,Quene和Topic都存储在这个表:
- id数据库的自增主键
- container:消息的Destination
- msgid_prod:消息的发送者客户端的主键
- msg_seq:是发消息的顺序,msgid_prod+msg_seq可以组成JMS的MessageID
- expiration:消息的过期时间,存储的是1970-01-01到现在的毫秒数
- msg:消息本体的java序列对象的二进制数据
- prioritry:优先级从0-9,数据越大优先级越高
- activemq_msg用于存储消息,Quene和Topic都存储在这个表:
- activemq_acks用于存储订阅关系,如果是持久化的Topic,订阅者和服务器订阅关系在这个表保:主要的数据库字段如下
- container:消息的Destination
- sub_dest:如果是使用的Static集群,这个字段会有集群和其他系统的信息
- client_id:订阅者都必须有一个唯一的客户端id用于区分
- sub_name:订阅者名称
- selector:选择器,可以选择只消费满足条件的消息,条件可以用自定义属性实现,可以支持多属性and和or操作
- last_acked_id:记录消费过的消息id
- activemq_lock在集群环境中才有用,只有一个broker可以获得消息,称为Master Broker,其他的只能作为备份等待
Master Broker不可用,才可能称为下一个Master Broker。这个表用于记录哪个Broker是当前的Master Broker.