一、ActiveMQ安全机制

ActiveMQ是使用jetty部署的,修改密码需要到相应的配置文件 
配置文件是这个:

在其第123行添加用户名和密码,添加配置如下:

    <plugins><simpleAuthenticationPlugin><users><authenticationUser username="bhz" password="bhz" groups="users,admins"/></users></simpleAuthenticationPlugin></plugins>

这时候这个需要改为这样才能进行连接:

//第一步:建立ConnectionFactory工厂对象ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("bhz","bhz","tcp://localhost:61616");

二、ActiveMQ的api的使用

1. Connection的使用

省略

2. Session方法的使用

一旦从ConnectionFactory中获得一个Connection,必须从Connection中创建一个或多个Session.Session是一个发送或接收消息的线程 
session可以被事务化,也可以不被事务化 
如果使用事务的话,那么需要commit,如下

package test.mq.helloworld;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class Sender {public static void main(String[] agrs) throws Exception{//第一步:建立ConnectionFactory工厂对象ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("bhz","bhz","tcp://localhost:61616");//第二步:通过ConnectionFactory工厂对象我们创建一个Connection对象Connection connection = connectionFactory.createConnection();connection.start();//第三步:通过connection对象创建Session会话,第一个参数为是否开启事务,第二个参数为签收模式,一般设置为自动签收Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);//第四步:通过Session创建Destination对象,queue1可看作是放入队列的消息名称,可以自定义Destination desiDestination = session.createQueue("queue1");//第五步:通过session创建消息的生产者或消费者,下面是创建生产者MessageProducer messageProducer = session.createProducer(desiDestination);//第六步:使用MessageProducer的set方法为其设置持久化特性和非持久化特性,后面再详细介绍messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//这里先设置为非持久化//第七步:通过JMS规范的TextMessage形式创建数据(通过session对象),并用MessageProducer的send方法发送数据for(int i =0; i<5;i++){TextMessage textMessage =  session.createTextMessage("这是消息内容,id为"+i);messageProducer.send(textMessage);}session.commit();if(connection!=null){connection.close();}}}

注意session.commit(); 
session的签收模式有三种情况: 
1. Session.AUTO_ACKNOWLEDGE :自动签收 
2. Session.CLIENT_ACKNOWLEDGE:客户端通过调用消息(Message)的acknowledge方法签收消息,在这种情况下,签收发生在Session层面:签收一个已消费的消息会自动签收这个Session所有已消费消息的收条 
3. Session.DUPS_OK_ACKNOWLEDGE:此选项指示Session不必确保对传送消息的签收。它可能引起消息的重复,但是降低了Session的开销,所以只有客户端能容忍重复的消息,才可使用 
上面三种模式,推荐使用的是Session.CLIENT_ACKNOWLEDGE 
它的操作如下:

package test.mq.helloworld;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class Receiver {public static void main(String[] agrs) throws Exception{//第一步:建立ConnectionFactory工厂对象ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("bhz","bhz","tcp://localhost:61616");//第二步:通过ConnectionFactory工厂对象我们创建一个Connection对象Connection connection = connectionFactory.createConnection();connection.start();//第三步:通过connection对象创建Session会话,第一个参数为是否开启事务,第二个参数为签收模式,一般设置为自动签收Session session = connection.createSession(Boolean.FALSE,Session.CLIENT_ACKNOWLEDGE);//第四步:通过Session创建Destination对象,queue1可看作是放入队列的消息名称,可以自定义Destination desiDestination = session.createQueue("queue1");//第五步:通过session创建消息的生产者或消费者,下面是创建消费者MessageConsumer messageConsumer = session.createConsumer(desiDestination);while(true){TextMessage msg = (TextMessage) messageConsumer.receive();msg.acknowledge();if(msg==null) {break;}System.out.println("收到的内容为"+msg.getText());}if(connection!=null){connection.close();}}}

使用该模式,需要手动的设置接收完毕的信号msg.acknowledge();,这可以当做告诉队列,这个消息已经接收完毕,可以销毁了。

3.MessageProducer

 
下面是改造后的代码:

package test.mq.helloworld;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class Sender {public static void main(String[] agrs) throws Exception{//第一步:建立ConnectionFactory工厂对象ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("bhz","bhz","tcp://localhost:61616");//第二步:通过ConnectionFactory工厂对象我们创建一个Connection对象Connection connection = connectionFactory.createConnection();connection.start();//第三步:通过connection对象创建Session会话,第一个参数为是否开启事务,第二个参数为签收模式,一般设置为自动签收Session session = connection.createSession(Boolean.TRUE,Session.CLIENT_ACKNOWLEDGE);//第四步:通过Session创建Destination对象,queue1可看作是放入队列的消息名称,可以自定义Destination desiDestination = session.createQueue("queue1");//第五步:通过session创建消息的生产者或消费者,下面是创建生产者MessageProducer messageProducer = session.createProducer(null);//第六步:使用MessageProducer的set方法为其设置持久化特性和非持久化特性,后面再详细介绍//  messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//这里先设置为非持久化//第七步:通过JMS规范的TextMessage形式创建数据(通过session对象),并用MessageProducer的send方法发送数据for(int i =0; i<5;i++){//第一个参数:目的地//第二个参数:消息文本//第三个参数:接收模式//第四个参数:优先级//第五个参数:消息在消息队列保存的时间,这里指保存2分钟TextMessage textMessage =  session.createTextMessage("这是消息内容,id为"+i);messageProducer.send(desiDestination,textMessage,DeliveryMode.NON_PERSISTENT, i,1000*60*2);}session.commit();if(connection!=null){connection.close();}}}

需要注意以下内容: 
1. 优先级并不是严格遵循的 
2. 消息在队列中超过保存事件后,还没有人取,那么就会自动消失

4.MessageConsumer

三、订阅模式的使用

上面及之前的文章的是p2p模式(点对点模式) 
那么发布订阅模式又是如何处理的?下面先看发布/订阅模式相关的含义: 
 
下面是demo案例 
消息生产者

package bhz.mq.pd;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
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;public class Publish {private ConnectionFactory factory;private Connection connection;private Session session;private MessageProducer producer;public Publish(){try {factory = new ActiveMQConnectionFactory("bhz","bhz","tcp://localhost:61616");connection = factory.createConnection();connection.start();session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);producer = session.createProducer(null);} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void sendMessage() throws Exception{Destination destination = session.createTopic("topic");TextMessage textMessage = session.createTextMessage("我是内容");producer.send(destination, textMessage);}public static void main(String[] agrs) throws Exception{Publish p = new Publish();p.sendMessage();}
}

上面的主题是:topic 
当发布一条消息的时候,便会在后台topics上显示 

下面是消费者的代码,消费者订阅了topic主题

package bhz.mq.pd;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;public class Consumer1 {private ConnectionFactory factory;private Connection connection;private Session session;private MessageConsumer consumer;public Consumer1(){try {factory = new ActiveMQConnectionFactory("bhz","bhz","tcp://localhost:61616");connection = factory.createConnection();connection.start();session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void receive() throws Exception{Destination destionation = session.createTopic("topic");consumer = session.createConsumer(destionation);consumer.setMessageListener(new Listener());}public static void main(String[] agrs) throws Exception{Consumer1 consumer1 = new Consumer1();consumer1.receive();}class Listener implements MessageListener{@Overridepublic void onMessage(Message msg) {// TODO Auto-generated method stubSystem.out.println("这是接收的内容:"+msg);}}
}

这时候只要生产者发布消息,那么消费者就会接收到消息

ActiveMQ(三):ActiveMQ的安全机制、api及订阅模式demo相关推荐

  1. 微服务系列笔记之API事件订阅模式和元数据模式

    导语 今天继续总结关于micro api的其它用法.因为每个知识点基本类似,在这篇笔记中了event和meta做对比.本系列的笔记全部参考Go Micro官方源码及博客,比较多,有兴趣的可以去研究. ...

  2. activemq nodejs stomp 重连机制_5分钟优劣分析 Kafka、RabbitMQ、RocketMQ、ActiveMQ消息队列...

    一.资料文档 Kafka:中,有kafka作者自己写的书,网上资料也有一些. rabbitmq:有一些不错的书,网上资料多. zeromq:少.没有专门写zeromq的书,网上的资料多是一些代码的实现 ...

  3. Spring Boot整合ActiveMQ及场景举例(点对点模式、订阅模式)

    目录 前序 为什么要引入MQ 注册案例--不使用MQ 注册案例--引入MQ(点对点模式) 注册案例--引入MQ(发布/订阅模式) 安装Active MQ 使用Spring Boot进行整合(点对点模式 ...

  4. activemq 开启监听_SpringBoot集成ActiveMQ怎么实现Topic发布/订阅模式通信?

    上一期我们讲了SpringBoot集成activeMQ实现Queue模式点对点通信,这一期我们接着讲SpringBoot集成activeMQ实现Topic发布/订阅模式通信. 发布/订阅模式通信是对点 ...

  5. kube-controller-manager源码分析(三)之 Informer机制

    本文个人博客地址:https://www.huweihuang.com/kubernetes-notes/code-analysis/kube-controller-manager/sharedInd ...

  6. 微信小程序把玩(三十五)Video API

    原文:微信小程序把玩(三十五)Video API 电脑端不能测试拍摄功能只能测试选择视频功能,好像只支持mp4格式,值得注意的是成功之后返回的临时文件路径是个列表tempFilePaths而不是tem ...

  7. css中的三种基本定位机制

    css中的三种基本定位机制 a.普通文档流 b.定位:相对定位 绝对定位 固定定位 c.浮动 1.普通流中,元素位置由文档顺序和元素性质决定,块级元素从上到下依次排列,框之间的垂直距离由框的垂直mar ...

  8. ActiveMQ入门-ActiveMQ环境搭建

    http://activemq.apache.org/从阿帕奇的官方下载,ActiveMQ的环境搭建依赖于JDK,建议使用1.8 解压缩就能用,执行bin文件夹下面的可执行文件 ➜ ~ cd /Use ...

  9. 微信小程序把玩(三十二)Image API

    原文:微信小程序把玩(三十二)Image API 选择图片时可设置图片是否是原图,图片来源.这用的也挺常见的,比如个人中心中设置头像,可以与wx.upLoadFile()API使用 主要方法: wx. ...

最新文章

  1. 大数据学习笔记1000条
  2. 《OpenGL超级宝典》编程环境配置
  3. linux消息队列的使用
  4. Python读取文本,输出指定中文(字符串)
  5. html htc控件详解,*.HTC 文件的简单介绍-网页设计,HTML/CSS
  6. 多层动态库的编译及使用
  7. 软件设计师22-存储器系统01
  8. 创建SSIS包—建立端到端的package
  9. python集合的定义方式_11-Python基础知识学习—集合类型
  10. 如何制作一个有颜色的ListBox,颜色选择下拉列表
  11. (翻译)从底层了解ASP.NET体系结构 [转]
  12. 安装系统或者进PE蓝屏 代码:IRQL NOT LESS OR EQUAL
  13. 设置JTree树形结构文字的颜色以及文字背景颜色的方法_-Chaz-_新浪博客
  14. ThinkPad T410I 安装 Mac 10.9 Mavericks
  15. 网络图片地址直接转Base64
  16. Comparator.comparing比较排序
  17. python 求特征值特征向量 numpy.linalg.eig()
  18. mysql emoji 问号_mysql数据库怎么存入emoji表情,更改utf8mb4后为什么出现全是问号...
  19. linux防火墙关了连不上,SecrueCRT连接linux需要关闭linux防火墙_Centos 6.4 iptables防火墙关闭启动详解...
  20. 一文让你搞懂什么是Redis集群

热门文章

  1. java某个类避免findbug检查_Findbug插件静态java代码扫描工具使用
  2. 2017韩老师计算机网络,2017年计算机等考三级网络技术辅导:计算机网络拓扑结构...
  3. element 搜索匹配_分享一个element-ui级联选择器的搜索问题,顺便问下有没有解决方案。...
  4. android 4.0系统,全新Android 4.0系统_手机Android频道-中关村在线
  5. mysql百万级去重_mysql优化小技巧之去除重复项(百万级数据)
  6. TensorFlow1-张量
  7. Maven项目配置、检出、运行
  8. 表单的ajax填入问题
  9. java环境配置—配置Tomcat8环境
  10. 新版的sublime text 3无法设为默认启动程序