一、ActiveMQ安全机制配置
概念:只有符合验证的用户才能进行发送和获取信息。
1.1、修改配置文件
路径:apache-activemq-5.11.1\conf\activemq.xml
添加插件位置:
1.2、代码验证
下面的操作会报错,原因是该用户没有经过验证
下面我修改成已经添加验证的用户,在试下发送信息
后台控制台查看结果:
二、ActiveMQ事务
2.1、ActiveMQ使用事务发送消息
下面我们用代码和运行结果来验证ActiveMQ使用事务,案例:
首先我们在ActiveMQ发送端使用事务
package com.debug.test;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 生产者
* @author debug
* @Date 2018-1-18
*/
public class Sender {
public static void sender() throws JMSException {
// 1、建立ConnecttionFactory工厂连接对象,需要填入用户名、密码、以及连接地址,均使用默认就行
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"debug",
"debug",
"tcp://localhost:61616");
//2、通过工厂连接对象进行建立连接connection,并且开启连接(默认时关闭的)
Connection connection = connectionFactory.createConnection();
connection.start();
//3、通过连接创建session会话(上下文环境对象),用于接受信息、参数配置:1为是否启用事务、参数配置2为签收模式、一般我们设置为自动签收。
//Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//使用事务进行提交
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("queue01");
//4、通过session获对象,指的时一个客户端用来指定生产消费目标合消费信息来源的对象,
//5、我们需要通过sesion对象创建消息的发动合接受对象(生产者合消费者)MessageProducer/MessageConsumer
MessageProducer messageProducer = session.createProducer(destination);
//6、我们可以使用messageProducer的setDeiveryMode方法为其设置持久化性合非持久化(DeiveryMode)
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//7、最后发送信息(使用JMS规范)
for (int i = 0; i <5; i++) {
TextMessage textMessage = session.createTextMessage("我是debug");
messageProducer.send(textMessage);
System.out.println("生产者正在生产......."+ i);
}
System.out.println("生产者生产消息完成.......");
//紧密判断
if(connection != null){
connection.close();
}
}
public static void main(String[] args) throws JMSException {
sender();
}
}
关键代码:
设置为Boolean.TRUE则表示使用事务进行提交,好了,到这步我们就已经使用事务提交了,下面我们来看下ActiveMQ控制台输出:
按理来说,控制台出单生产信息的话就说明已经发送成功了,那好我们就访问ActiveMQ后台看下队列是否已经生成了,
可是当你看到这结果时,你惊讶的问题,java控制台发送成功了,为什么还是0呢?
分析问题:
作为一个善于思考的程序员,当使用事务开始我们就知道,开启事务肯定是要提交事务的,所以我们是不是少了提交事务这一步呢;下面我添加上提交事务,再验证一遍。
java控制台:
接下来我们再看下消息队列
到这里我们就演示使用事务完成了
2.2、消费端签收模式
AUTO_ACKNOWLEDGE、CLIENT_ACKNOWLEDGE
2.2.1、自动签收
刚才验证事务的时候,我们使用的就是自动签收,意思就是只要消费者消息收到了这条消息,就自动签收,发送ack确认消息给activemq告知已经收到了,这样activemq中的消息才能真正被消费,不然会一直存在!由于自动确认签收的机制,消息一定会被消费,不需要额外确认
2.2.2、手动签收
CLIENT_ACKNOWLEDGE
流程图
设置为手动签收处模式代码设置
生产者
消费者:
消费者配置这里之外还不属于正在的消费额,我们可以运行看下
消费之前
消费之后,先看java控制台
看java控制台以为是已经消费了,那我们看下ActiveMQ控制台
你会很惊奇的发现,其实还没有真正的进行消费,为什么?看下流程图03你久明白了;所谓我们要在消费端添加通知方法
最后看下控制台已经被消费了
开始