二、ActiveMQ安全认证和消息持久化

一、安全认证

在这里插入图片描述
上面的读写和管理的操作可以修改成其他用户组,也可以同时使用多个用户组使用,分隔,例如: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=adminadmins表示用户组、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。是集群中的锁机制,保证数据不会出错。

公众号二维码
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值