快速上手MQ之activeMQ(4)--消息持久化

来源:互联网 发布:日本手办产业数据 编辑:程序博客网 时间:2024/06/07 20:32

消息持久化顾名思义就是把发布的消息进行落地,这样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这样也就算完成消息的持久化了

原创粉丝点击