文章目录

  • 不带日志的jdbc
  • 配置步骤
  • 3张表
  • 队列
  • 主题
  • 非持久化订阅
  • 持久化订阅
  • 带日志的jdbc
  • 配置步骤


不带日志的jdbc

配置步骤

首先将mysql驱动包复制到activemq的lib目录,然后编辑activemq.xml文件,指定持久化方式为jdbcPesistenAdapter,并配置数据源:

<broker>
<persistenceAdapter>
    <!--<kahaDB directory="${activemq.data}/kahadb"/>-->
    <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</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://192.168.127.133:3306/activemq?relaxAutoCommit=true"/>
  <property name="username" value="root"/>
  <property name="password" value="123456"/>
  <property name="poolPreparedStatements" value="true"/>
</bean>

./activemq restart重启mq,表会自动创建,再重启不会覆盖原有数据

activemq 清除队列 activemq删除持久化订阅_中间件

3张表

ACTIVEMQ_MSGS:存储队列或主题的消息
ACTIVEMQ_ACKS:持久化订阅时消费者的信息以及最近的消息ID

队列

生产者发送3条消息:

activemq 清除队列 activemq删除持久化订阅_中间件_02


再发送3条消息,非持久化方式,表中不会存储消息,积压消息数为6,进队消息为3:

activemq 清除队列 activemq删除持久化订阅_java_03


消费完后,积压消息清零,出队消息为6,表中消息删除:

activemq 清除队列 activemq删除持久化订阅_消息队列_04


activemq 清除队列 activemq删除持久化订阅_java_05

主题

非持久化订阅

表中不会存储消息,也不会存储订阅者

持久化订阅

会存储消息和订阅者

持久化订阅之后,active_acks,client_id是客户端指定的唯一标识,last_acked_id是最近消费过的消息序号,对应active_msgs表的ID

activemq 清除队列 activemq删除持久化订阅_activemq 清除队列_06


生产者发布消息,active_msgs,container是消息目的地,msgid_prod和msgid_seq共同组成messageID,

activemq 清除队列 activemq删除持久化订阅_activemq_07


消费之后,active_acks表的last_acked_id变为最近消费过的消息ID,6,而与队列不同的是,持久化订阅主题active_msgs表中在消费过后的消息不会删除

activemq 清除队列 activemq删除持久化订阅_消息队列_08


生产者增加一行非持久化发布,因为是存储在内存中,active_msgs不会增加消息记录,然后消费,能获取到消息,而last_acked_id仍为6:

producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

带日志的jdbc

带高性能日志的jdbc避免了每次生产和消费时都去读库和写库,而是先把消息存到日志文件里面,在MQ和数据库之间加了一层高速缓存,当消费者的速度能跟上生产时,已被消费过的消息可以直接删除,不用入库,只把少量未来得及消费的消息批量入库。

配置步骤

activemq.xml添加配置:

<persistenceFactory>
    <journalPersistenceAdapterFactory journalLogFiles="5" 
journalLogFiles="4"
journalLogFileSize="1000"
useJournal="true"
useQuickJournal="true"
dataDirectory="${activemq.data}" />
    <!-- To use a different dataSource, use the following syntax : -->
    <!-- <journalPersistenceAdapterFactory journalLogFiles="5" dataDirectory="${basedir}/activemq-data" dataSource="#mysql-ds"/> -->
</persistenceFactory>
<transportConnectors>...

MQ重启后data目录自动新建journal目录,下面有4个日志文件,每个日志文件大小为1000K

activemq 清除队列 activemq删除持久化订阅_中间件_09

生产者写入3条消息,队列中显示已入队,但消息表没写入,隔一段时间后才写入。消费了的消息也是过一会才删

activemq 清除队列 activemq删除持久化订阅_java_10