利用消息队列的异步策略,可以从很大程序上缓解程序的压力,但是,如果MQ所在的机器down机了,又如果队列中的数据不是持久的就会发生数据丢失,后果是可想而知的, 所以消息的持久化是不可不讨论的话题。 1) 关于ActiveMQ消息队列的持久化,主要是在ActiveMQ的配置文件中设置(看粗体部分). 改动部分主要是设置了mysql的datasource声明, 还有就是采用mysql作为persistenceAdapter,并声明如下。 - <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/activemq?relaxAutoCommit=true"/>
- <property name="username" value="root"/>
- <property name="password" value=""/>
- <property name="maxActive" value="200"/>
- <property name="poolPreparedStatements" value="true"/>
- </bean>
-
-
-
- <persistenceAdapter>
- <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
- </persistenceAdapter>
2) 把数据库的驱动放入ActiveMQ的lib中,使其能够访问相应的数据库,关于数据库的表结构,ActiveMQ会自动创建,但是前提是当ActiveMQ启动以后,声明的数据库要是存在的。 测试的时候发现以上条件都满足ActiveMQ还是会抛异常,看了一下异常,是有一张表(activemq_acks)创建的时候出了问题,自己手动创建后好了,把表结构列出来。 - -- phpMyAdmin SQL Dump
- -- version 2.10.2
- -- http:
- --
- -- 主机: localhost
- -- 生成日期: 2009 年 11 月 06 日 05:29
- -- 服务器版本: 5.0.45
- -- PHP 版本: 5.2.3
-
- SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-
- --
- -- 数据库: `activemq`
- --
-
- -- --------------------------------------------------------
-
- --
- -- 表的结构 `activemq_acks`
- --
-
- CREATE TABLE `activemq_acks` (
- `SUB` varchar(250) collate utf8_bin NOT NULL,
- `CONTAINER` varchar(250) collate utf8_bin NOT NULL,
- `LAST_ACKED_ID` int(11) default NULL,
- `SE_ID` int(11) default NULL,
- `SE_CLIENT_ID` varchar(250) collate utf8_bin default NULL,
- `SE_CONSUMER_NAME` varchar(250) collate utf8_bin default NULL,
- `SE_SELECTOR` varchar(250) collate utf8_bin default NULL
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-
- --
- -- 导出表中的数据 `activemq_acks`
- --
-
-
- -- --------------------------------------------------------
-
- --
- -- 表的结构 `activemq_lock`
- --
-
- CREATE TABLE `activemq_lock` (
- `ID` bigint(20) NOT NULL,
- `TIME` bigint(20) default NULL,
- `BROKER_NAME` varchar(250) collate utf8_bin default NULL,
- PRIMARY KEY (`ID`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-
- --
- -- 导出表中的数据 `activemq_lock`
- --
-
- INSERT INTO `activemq_lock` (`ID`, `TIME`, `BROKER_NAME`) VALUES
- (1, 1257485355546, NULL);
-
- -- --------------------------------------------------------
-
- --
- -- 表的结构 `activemq_msgs`
- --
-
- CREATE TABLE `activemq_msgs` (
- `ID` int(11) NOT NULL,
- `CONTAINER` varchar(250) collate utf8_bin default NULL,
- `MSGID_PROD` varchar(250) collate utf8_bin default NULL,
- `MSGID_SEQ` int(11) default NULL,
- `EXPIRATION` bigint(20) default NULL,
- `MSG` longblob,
- PRIMARY KEY (`ID`),
- KEY `ACTIVEMQ_MSGS_MIDX` (`MSGID_PROD`,`MSGID_SEQ`),
- KEY `ACTIVEMQ_MSGS_CIDX` (`CONTAINER`),
- KEY `ACTIVEMQ_MSGS_EIDX` (`EXPIRATION`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-
- --
- -- 导出表中的数据 `activemq_msgs`
- --
当消息发送至ActiveMQ时,数据就被持久化到mysql了,如果消息被消费,数据会自动被删除,down机后重启没影响,有一点不好的是,这个有点拖数据库,我在本地的mysql,一开启ActiveMQ, 数据库就会变得很慢,不过这个只是在本地的机子上,想必实际应用时应该好很多。
|