文章目录
- 不带日志的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,表会自动创建,再重启不会覆盖原有数据:
3张表
ACTIVEMQ_MSGS:存储队列或主题的消息
ACTIVEMQ_ACKS:持久化订阅时消费者的信息以及最近的消息ID
队列
生产者发送3条消息:
再发送3条消息,非持久化方式,表中不会存储消息,积压消息数为6,进队消息为3:
消费完后,积压消息清零,出队消息为6,表中消息删除:
主题
非持久化订阅
表中不会存储消息,也不会存储订阅者
持久化订阅
会存储消息和订阅者
持久化订阅之后,active_acks,client_id是客户端指定的唯一标识,last_acked_id是最近消费过的消息序号,对应active_msgs表的ID
生产者发布消息,active_msgs,container是消息目的地,msgid_prod和msgid_seq共同组成messageID,
消费之后,active_acks表的last_acked_id变为最近消费过的消息ID,6,而与队列不同的是,持久化订阅主题active_msgs表中在消费过后的消息不会删除
生产者增加一行非持久化发布,因为是存储在内存中,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
生产者写入3条消息,队列中显示已入队,但消息表没写入,隔一段时间后才写入。消费了的消息也是过一会才删