ActiveMQ -- 中间件之运用(二)

                                                    

 

一、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你久明白了;所谓我们要在消费端添加通知方法

最后看下控制台已经被消费了

 

开始

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值