消息持久化顾名思义就是把发布的消息进行落地,这样activeMQ宕机也不会导致那些未被消费的消息给弄消失,这样保证消息都能被消费。
activeMQ消息持久化有JDBC,AMQ,KahaDB和LevelDB等这几种,默认采用的是KahaDB,本篇讲的是如何采用jdbc的新式把消息存入数据库的例子;
activeMQ默认采用的KahaDB,消息会落地到安装目录下的\data\kahadb这个目录下
下面讲讲如何用jdbc进行消息持久化到数据库
1.修改activemq.xml配置
这里修改的activemq.xml文件是activemq安装目录下的conf/activemq.xml文件,与我们的项目无关
修改内容:
1.1注释掉broker下的默认持久化方式:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
1.2在之下添加如下内容:
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#derby-ds"/>
</persistenceAdapter>
1.3在broker外添加如下内容:
<bean id="derby-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value=""/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
注意:这里用到了连接池以及mysql所以需要的包有:commons-dbcp-1.4.jar;commons-pool-1.5.4.jar;mysql-connector-java-5.1.22.jar这三个包
我的数据库名activemq
2.下载及拷贝需要的jar把1.3所说需要的jar拷贝到安装目录下的/lib目录下即可
3.重启activemq
启动之后activemq库里面会生成3张表
1)activemq_acks:用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存,主要数据库字段如下:
container:消息的destination
sub_dest:如果是使用static集群,这个字段会有集群其他系统的信息
client_id:每个订阅者都必须有一个唯一的客户端id用以区分
sub_name:订阅者名称
selector:选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性and和or操作
last_acked_id:记录消费过的消息的id
2)activemq_lock:在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker,其他的只能作为备份等待Master Broker不可用,才可能成为下一个Master Broker。这个表用于记录哪个Broker是当前的Master Broker。
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,数值越大优先级越高
activemq_acks用于存储订阅关系。如果是持久化topic,订阅者和服务器的订阅关系在这个表保存。
注意:消息持久化的所有修改都与项目无关,都是直接操作安装目录下的文件
4.启动我们之前做的activeMQ项目
4.1访问http://localhost:8080/activeMQ/activeMQ/main,发布queue消息
4.2查看数据表activemq_msgs,会生成一条数据
4.3如果我们发布的是topic消息的话,查看activemq_acks表会有订阅者的关系信息:
activemq_msgs表信息:
4.4消费消息,访问http://localhost:8080/activeMQ/activeMQ/receive
activemq_msgs生成的一条数据将消失
5.ok这样也就算完成消息的持久化了