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 這個方式 高速緩存來代替以上方案,後續會介紹這種方案,有問題的可以關注我的公衆號,或者在下方留言討論。
歡迎關注我的公衆號:微信江湖,一起來學習: