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

歡迎關注我的公衆號:微信江湖,一起來學習:

 

 

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