ActiveMQ为了达到高可用,也用了持久化存储,保证数据不丢失。主要采用了一下几种方式:
1.AMQ Message Store
2.KahaDB消息存储(默认)
3.JDBC消息存储
4.LevelDB消息存储
5.JDBC Message store with ActiveMQ Journal
以上方式可以参考官网
http://activemq.apache.org/persistence
今天讲下JDBC消息存储的配置:
1.增加mysql驱动包
2.在conf目录下修改activemq.xml配置
此配置需要注意createTablesOnStartup="true" 属性 默认为true,第一次启动会创建表,第二次启动一定要改为false,否则会覆盖表,把数据清掉的
3.增加mysql-ds的引用
以上数据库配置是在另外一台服务器,生产环境肯定也是在不同的服务器,才能保证消息的高可用。
重启启动mq服务,观看activemq数据库中增加了三张表:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `activemq_acks`
-- ----------------------------
DROP TABLE IF EXISTS `activemq_acks`;
CREATE TABLE `activemq_acks` (
`CONTAINER` varchar(250) NOT NULL,
`SUB_DEST` varchar(250) DEFAULT NULL,
`CLIENT_ID` varchar(250) NOT NULL,
`SUB_NAME` varchar(250) NOT NULL,
`SELECTOR` varchar(250) DEFAULT NULL,
`LAST_ACKED_ID` bigint(20) DEFAULT NULL,
`PRIORITY` bigint(20) NOT NULL DEFAULT '5',
`XID` varchar(250) DEFAULT NULL,
PRIMARY KEY (`CONTAINER`,`CLIENT_ID`,`SUB_NAME`,`PRIORITY`),
KEY `ACTIVEMQ_ACKS_XIDX` (`XID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of activemq_acks
-- ----------------------------
-- ----------------------------
-- Table structure for `activemq_lock`
-- ----------------------------
DROP TABLE IF EXISTS `activemq_lock`;
CREATE TABLE `activemq_lock` (
`ID` bigint(20) NOT NULL,
`TIME` bigint(20) DEFAULT NULL,
`BROKER_NAME` varchar(250) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of activemq_lock
-- ----------------------------
INSERT INTO `activemq_lock` VALUES ('1', null, null);
-- ----------------------------
-- Table structure for `activemq_msgs`
-- ----------------------------
DROP TABLE IF EXISTS `activemq_msgs`;
CREATE TABLE `activemq_msgs` (
`ID` bigint(20) NOT NULL,
`CONTAINER` varchar(250) NOT NULL,
`MSGID_PROD` varchar(250) DEFAULT NULL,
`MSGID_SEQ` bigint(20) DEFAULT NULL,
`EXPIRATION` bigint(20) DEFAULT NULL,
`MSG` longblob,
`PRIORITY` bigint(20) DEFAULT NULL,
`XID` varchar(250) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `ACTIVEMQ_MSGS_MIDX` (`MSGID_PROD`,`MSGID_SEQ`),
KEY `ACTIVEMQ_MSGS_CIDX` (`CONTAINER`),
KEY `ACTIVEMQ_MSGS_EIDX` (`EXPIRATION`),
KEY `ACTIVEMQ_MSGS_PIDX` (`PRIORITY`),
KEY `ACTIVEMQ_MSGS_XIDX` (`XID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of activemq_msgs
-- ----------------------------
以上sql是启动时候创建的表
有需要的朋友都可以试试效果,次方式会有性能的损耗,一般生产会用JDBC Message store with ActiveMQ Journal 这个方式 高速缓存来代替以上方案,后续会介绍这种方案,有问题的可以关注我的公众号,或者在下方留言讨论。
欢迎关注我的公众号:微信江湖,一起来学习: