一、安全认证
上面的读写和管理的操作可以修改成其他用户组,也可以同时使用多个用户组使用,
分隔,例如:read="admins,users"
,admins
组和users
组,这时候需要在conf/groups.properties
文件中加入users
组,.如下:
<plugins>
<jaasAuthenticationPlugin configuration="activemq"/>
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<authorizationEntry topic=">" read="admins,users" write="admins,users" admin="admins,users"/>
<authorizationEntry queue=">" read="admins,users" write="admins,users" admin="admins,users"/>
<authorizationEntry topic="ActiveMQ.Advisory.>" read="admins,users" write="admins,users"
admin="admins,users"/>
<authorizationEntry queue="ActiveMQ.Advisory.>" read="admins" write="admins,users"
admin="admins,users"/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
在 <jaasAuthenticationPlugin/>
标签中的configuration
的值是activemq
要与conf/login.config
中的节点名一致,如下conf/login.config
节点:
activemq {
org.apache.activemq.jaas.PropertiesLoginModule required
org.apache.activemq.jaas.properties.user="users.properties"
org.apache.activemq.jaas.properties.group="groups.properties";
};
org.apache.activemq.jaas.properties.user=“users.properties” :表示用户信息存放在users.properties配置文件中
org.apache.activemq.jaas.properties.group=“groups.properties”:表示用户组信息存放在groups.properties配置文件中
- 1)在
groups.properties
文件中
admins=admin
(admins
表示用户组、admin
表示用户,如果有多个用户使用逗号分隔,例如:admins=admin,zhangsan
)
还可以添加用户组:
users=lisi
- 2)在
users.properties
文件中
admin=admin
(“=”左边表示用户名,"="右边表示密码。如果有多个用户就回车,格式同样是 用户名=密码)
二、ActiveMQ的持久化
ActiveMQ的持久化是指对消息数据的持久化。在ActiveMQ中,消息默认是保存在内存中,当内存不足时,或者ActiveMQ正常/不正常关闭时,就会将内存中的消息持久化到磁盘中。具体的持久化策略由conf/activemq.xml
配置文件配置决定。(所有持久化配置都在conf/activemq.xm
中配置,配置信息都在broker
标签里定义)。
ActiveMQ的默认持久化策略时kahadb,消息数据是保存在内存中。如果选用JDBC为持久化策略,消息数据就会保存在数据库中。
1、kahadb持久化策略
是ActiveMQ的默认持久化策略。kahadb是一个文件型数据库,是使用内存+文件存储的方式进行持久化的。kahadb配置在conf/activemq.xml配置文件的broker标签中。
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
directory表示保存数据目录,${activemq.data}/kahadb表示kahadb保存在activemq安装路径下的data目录中。
特性:
- 1、日志形式存储消息;
- 2、消息索引以B-Tree结构存储,可以快速更新消息数据;
- 3、完全支持JMS事务;
- 4、支持多种恢复机制。
2、JDBC持久化策略
ActiveMQ可以将数据持久化到数据库中,不指定数据库类型,可以使用任意数据库。这里使用的是MySQL数据库。
首先在conf/activemq.xml
中配置数据库连接池(数据库连接池就不在broker
标签中)
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activemq"/>
<property name="username" value="xxx"/>
<property name="password" value="xxx"/>
<property name="maxActive" value="10"/>
<property name="minIdle" value="5"/>
</bean>
然后在broker
标签里的persistenceAdapter
标签下创建一个jdbcPersistenceAdapter
标签,然后引用数据源。
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#dataSource" createTablesOnStarup="false"/>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
</persistenceAdapter>
dataSource="#dataSource"
引用的就是数据源定义的id里的值
createTablesOnStarup="false"
表示在ActiveMQ启动是是否创建数据表,一般在第一次启动的时候把值改为true
,然其自动把表创建出来,创建后就可以把这个值修改为false
,避免每次启动ActiveMQ都创建数据表,这样会把之前有可能带数据的表给覆盖掉。
配置完成后,需要在ActiveMQ的lib
目录下引入数据库驱动jar
包和数据库连接池jar
包,然后在MySQL中创建库,否则会报错。
启动ActiveMQ,这时候启动的速度可能比之前要稍慢一些,请耐心等待,启动完成后,在activemq这个数据库中就生成了一下三张数据表:
1、ACTIVEMQ_ACKS:用户存储订阅关系的表,如果是持久化Topic(发布/订阅模式),那么订阅关系就会在这张表中保存。字段:
- 1)CONTAINER:消息的Destination(目的地);
- 2)SUB_DEST:如果是使用Static集群,这个字段会有其他集群的信息;
- 3)CLIENT_ID:每个订阅者必须有一个客户端ID用以区分;
- 4)SUB_NAME:订阅者名称;
- 5)SELECTOR:选择器,可以只选择消费满足条件的消息。条件可以使用自定义属性实现,可支持多属性AND和OR操作;
- 6)LAST_ACKED_ID:记录消费过的消息的id;
- 7)PRIORITY:优先级。0-9数值越大优先级越高。
2、ACTIVEMQ_MSGS:用于存储消息,Queue和Topic都i存在这张表中。当消息生产者发送消息,并且消息消费者未消费消息的时候,消息会保存到数据库中。当消息被消费后,该消息就会从数据库中删除。
字段:
- 1)ID:自增长的主键;
- 2)CONTAINER:消息的Destination(目的地);
- 3)MSGID_PROD:消息发送者客户端的主键;
- 4)MSGID_SEQ:发送消息的顺序,MSGID_PROD+MSG_SEQ可以组成JMS的Message ID;
- 5)EXPIRATION:消息的过期时间,存储的时间是从1970-01-01到现在时间的毫秒数;
- 6)MSG:消息体的Java序列化对象的二进制数据;
- 7)PRIORITY:优先级。0-9数值越大优先级越高。
3、ACTIVEMQ_LOCK:这个表只有在集群中才有用,只有一个Borker可以获得消息,称为Master Borker。是集群中的锁机制,保证数据不会出错。
公众号二维码