ActiveMQ 持久化之JDBC消息存储

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 这个方式 高速缓存来代替以上方案,后续会介绍这种方案,有问题的可以关注我的公众号,或者在下方留言讨论。

欢迎关注我的公众号:微信江湖,一起来学习:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章