四 ActiveMQ消息持久化与配置

一、ActiveMQ 消息持久化

1、新建数据库

首先我们先新建一个mysql数据库,并把所有权限赋给新建用户,用户需要在建表的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/**
*
创建数据库
*/
CREATE DATABASE misc
DEFAULT CHARSET=UTF8;

/**
*
创建用户和授权
*/
GRANT ALL PRIVILEGES ON misc.*
TO 'misc_root'@'%' IDENTIFIED
BY 'misc_root_pwd';
GRANT ALL PRIVILEGES ON misc.*
TO 'misc_root'@'localhost' IDENTIFIED
BY 'misc_root_pwd';

2、配置数据源

在ActiveMQ目录中找到conf/activemq.xml 文件。
ActiveMQ默认使用的是kahadb 我们在xml中修改成使用mysql
在文件中找到:

1
2
3
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

把它注释掉,添加mysql的配置

1
2
3
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#MySQL-DS" />
</persistenceAdapter>
在</broker>后面添加数据源的配置
1
2
3
4
5
6
7
8
<!-- MySQL DataSource -->
<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://127.0.0.1:3306/misc?useUnicode=true&amp;characterEncoding=UTF-8" />
<property name="username" value="misc_root" />
<property name="password" value="misc_root_pwd" />
<property name="poolPreparedStatements" value="true" />
</bean>

这里的ID对应的就是我们上面配置的ID。
最后,我们需要把mysql的jar包复制到ActiveMQ目录中的lib目录下,
接着重新启动ActiveMQ,这时它会自动在数据库中生成三张表
数据表

我们可以用上一篇文章写的代码做测试,发布的消息会被存储在mysql数据库中,被消费后会自动删除。

二、ActiveMQ配置

在第二篇文章中,我人提到ActiveMQ管理页面的登陆用户与密码默认是admin/admin。这个默认的用户与密码在正式环境中肯定是需要修改的。

1、ActiveMQ管理页面登陆配置

我们找到ActiveMQ目录中的 conf/jetty-realm.properties
jetty-realm.properties
可以看到配置了两个用户,admin与user。
配置的格式为:

​ 用户名:密码,用户角色

这里我们修改一下admin用户的密码,重新启动ActiveMQ,打开管理员后台http://localhost:8161/admin
弹出的登陆框中需要输入我们新设置的用户与密码才能登陆了。

2、ActiveMQ连接开启密码认证

**第一步:**找到 ActiveMQ目录中的conf/credentials.properties
credentials.properties
这里配置的是连接的用户与密码,我们可以把密码修改成123456。
第二步:找到activemq/conf/activemq.xml
在systemUsage 后面添加一个插件

1
2
3
4
5
6
7
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>

位置如图:
这里写图片描述

最后重启ActiveMQ ,如果我们还用前面的代码去连接ActiveMQ 会提示用户或密码无效。我们需要修改代码中的连接工厂内容。
在实例化工厂时传入我们修改后的用户与密码

//实例化连接工厂
        connectionFactory = new ActiveMQConnectionFactory("system","123456",JMSProducer.URL);

重新启动程序即可连接成功。
这样我们就实现了密码认证连接ActiveMQ。