activityMQ官网:http://activemq.apache.org/
有windows版与linux版
windows版启动
在bin目录下双击activemq.bat
linux版的安装与启动
安装:
1.首先下载
参考http://www.cnblogs.com/shihaiming/p/6008319.html
主要步骤是:
tar -xf ./apache-activemq-5.14.1-bin.tar.gz
cd ./apache-activemq-5.14.1-bin/bin
./activemq start
测试启动成功与否
ActiveMQ默认监听61616端口,查此端口看看是否成功启动
netstat -an|grep 61616
ps -ef |grep activemq
启动成功后访问
http://127.0.0.1:8161/admin/
登录的用户名与密码默认都是admin
持久化消息:
A:持久化为文件
这个你装ActiveMQ时默认就是这种,只要你设置消息为持久化就可以了。涉及到的配置和代码有
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
B:持久化为MySql
你首先需要把MySql的驱动放到ActiveMQ的Lib目录下,我用的文件名字是:mysql-connector-java-5.1.40.jar
接下来你修改配置文件
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.data}/mysqldb" dataSource="#mysql-ds"/>
</persistenceAdapter>
在网上还看到还有这种配置,我没尝试
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.data}/mysqldb" dataSource="#mysql-ds" createTablesOnStartup="false" />
</persistenceAdapter>
dataSource指定持久化数据库的bean,createTablesOnStartup是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成false。
在配置文件中的broker节点外增加
<bean id="mysql-ds" class="org.apache.commons.dbcp2.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="root"/>
<property name="maxTotal" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
修改后的效果如下:
从配置中可以看出数据库的名称是activemq,你需要手动在MySql中增加这个库。
然后重新启动消息队列,你会发现多了3张表
1:activemq_acks
2:activemq_lock
3:activemq_msgs
自动建表时activemq_msgs这张表很可能会报错,看到别人写的是要改编码为latin1,但是如果编码不能改的情况下那就手动建这张表吧。建表语句如下:
CREATE TABLE ACTIVEMQ_ACKS(
CONTAINER VARCHAR(250) NOT NULL,
SUB_DEST VARCHAR(250),
CLIENT_ID VARCHAR(250) NOT NULL,
SUB_NAME VARCHAR(250) NOT NULL,
SELECTOR VARCHAR(250),
LAST_ACKED_ID BIGINT,
PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
注意:
执行建表语句时可能会报下面的错误:
Specified key was too long; max key length is 767 bytes
这是因为Mysql的字段设置的太长了,所以在检表语句后面加入:ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
如何还是报错那就只能把字段的长度改短了。在mysql5.6报错,5.7不报错。
持久化到mysql后:
如果是queue,在没有消费者消费的情况下会将消息保存到activemq_msgs表中,只要有任意一个消费者已经消费过了,消费之后这些消息将会立即被删除。
如果是topic,此时如果还未曾有订阅者曾今订阅过此topic。这个时候就不会有任何记录持久化到表中,因为持久化一个没有订阅者的消息是浪费。
附上activityMQ的全部建表语句
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 '',
`XID` varchar(250) DEFAULT NULL,
PRIMARY KEY (`CONTAINER`,`CLIENT_ID`,`SUB_NAME`,`PRIORITY`),
KEY `ACTIVEMQ_ACKS_XIDX` (`XID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; 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=utf8mb4; DROP TABLE IF EXISTS `activemq_msgs`; CREATE TABLE `activemq_msgs` (
`ID` bigint(20) NOT NULL,
`CONTAINER` varchar(250) DEFAULT 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_EIDX` (`EXPIRATION`),
KEY `ACTIVEMQ_MSGS_PIDX` (`PRIORITY`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;