MQ服务器down机了,消息不会丢失的机制。
1、AMQ Message Store:基于文件的存储方式,是以前的默认消息存储,现在不用了
2、KahaDB消息存储(默认):基于日志文件,从ActiveMQ5.4开始默认的持久化插件。kahadb在消息保存目录中只有4类文件和一个lock
3、JDBC消息存储:消息基于JDBC存储的
4、LevelDB消息存储(了解
5、JDBC Message Store with ActiveMQ Journal
1、JDBC消息存储(MQ+MySQL)
1、添加mysql数据库的驱动包到MQ安装目录的lib文件夹
2、jdbcPersistenceAdapter配置
<!--注释以前的,添加如下配置-->
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
3、数据库连接池配置
<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.136.140/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
4、建仓SQL和建表说明
建一个名为activemq的数据库
运行代码会生成三张表ACTIVEMQ_MSGS、ACTIVEMQ_ACKS、、ACTIVEMQ_LOCK
5、代码运行验证
一定要开启持久化messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
6、小总结
如果是queue
在没有消费者消费的情况下会将消息保存到active_msgs表中,只要有任意一个消费者已经消费过了,消费之后这些消息将会立即被删除。
如果是topic
一般是先启动消费订阅然后再生产的情况下会将消息保存到activemq_acks。
这个activemq_acks这个表的CLIENT_ID就记录了订阅者订阅了哪个主题,订阅者所订阅的那些主题每一条都存在了ACTIVEMQ_MSGS这个表里面
2、JDBC Message store with ActiveMQ Journal
这种方式克服了JDBC消息存储的不足,JDBC每次消息过来,都要取写库和读库。JDBC Journal使用高速缓存写入技术,大大提高了性能。当消费者的消费速度能跟上生产者生产的速度时Journal文件能够大大减少需要写入到DB中消息
配置
<persistenceFactory>
<journalPersistenceAdapterFactory
journalLogFiles="4"
journalLogFileSize="32768"
useJournal="true"
useQuickJournal="true"
dataSource="#mysql-ds"
dataDirectory="activemq-data"/>
</persistenceFactory>