导读

  最新在接触ActiveMQ,里面有个持久订阅者模块,功能是怎么样也演示不出来效果。配置参数比较简单(配置没几个参数),消费者第一次运行时,需要指定ClientID(此时Broker已经记录离线订阅者信息),在启动提供者,此时消息队列存在一条记录,然后在启动消费者,但是怎么样也获取不到消息,阿西吧~~~什么鬼,百度上一大堆,都是这样步骤,消费者端,指定以下ClientID就好了,可,想要的效果死活不出来。。。。。。

采坑之路

废话不多说,先上代码,后面再分析

消费者端代码

    public void testTopicConsumer2() throws Exception {
//第一步:创建ConnectionFactory
String brokerURL = "tcp://192.168.31.215:61616";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
//第二步:通过工厂,创建Connection
Connection connection = connectionFactory.createConnection();
//设置持久订阅的客户端ID
String clientId = "10086";
connection.setClientID(clientId);
//第三步:打开链接
connection.start();
//第四步:通过Connection创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//第五步:通过session创建Consumer
Topic topic = session.createTopic("cyb-topic"); //创建持久订阅的消费者客户端
//第一个参数是指定Topic
//第二个参数是自定义的ClientId
MessageConsumer consumer = session.createDurableSubscriber(topic, clientId);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//第七步:处理信息
if (message instanceof TextMessage){
TextMessage tm=(TextMessage)message;
try{
System.out.println(tm.getText());
}
catch (Exception e){
e.printStackTrace();
}
}
}
});
//session.commit();
//第八步:关闭资源
consumer.close();
session.close();
connection.close(); }

  只需要制定ClientID和创建持久客户端即可

提供者端代码

   public void testTopicProducer() throws Exception {
Connection connection = null;
MessageProducer producer = null;
Session session = null;
try {
//第一步:创建ConnectionFactory,用于连接broker
String brokerURL = "tcp://192.168.31.215:61616";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
//设置
//((ActiveMQConnectionFactory) connectionFactory).setProducerWindowSize(1000);
//第二步:通过工厂,创建Connection
connection = connectionFactory.createConnection();
//第三步:连接启动
connection.start();
//第四步:通过连接获取session会话
//第一个参数:是否启用ActiveMQ事务,如果为true,第二个参数无用
//第二个参数:应答模式,AUTO_ACKNOWLEDGE为自动应答
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//第五步:通过session创建destination,两种目的地:Queue、Topic
//参数:消息队列的名称,在后台管理系统中可以看到
Topic topic = session.createTopic("cyb-topic");
//第六步:通过session创建MessageProducer
producer = session.createProducer(topic);
//producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//第七步:创建Message
//方式一
//TextMessage message=new ActiveMQTextMessage();
//message.setText("queue test");
//方式二
TextMessage message1 = session.createTextMessage("topic->博客园地址:https://www.cnblogs.com/chenyanbin/");
//第八步:通过producer发送消息
producer.send(message1);
//session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//第九步:关闭资源
producer.close();
session.close();
connection.close();
}
}

验证离线订阅者功能

失败的验证

正确的验证方式

  首先明确一点,上面的代码是没有一点问题的。为了节省时间,验证步骤和上面的差不多,不启动前两步了,直接启动第三步,也就是:

  1. 先启动消费者(记录持久订阅者ClientID);
  2. 在启动提供者;
  3. 启动消费者(在下面加个死循环)

问题剖析

  第一次运行消费者时,此时Broker已经记录订阅者ClientID,然后程序一闪而过,进入到蓝色框中的,离线订阅者中,然后在执行提供者,此时,Topic中,已经入队一次,再次运行消费者时,运行是异步获取的,运行一闪而过(鄙人猜测,可能是ActiveMQ机制问题,内部逻辑大概是,先遍历非持久订阅者,然后在查看持久订阅者,问题出在,程序执行太快,还没到查看持久订阅者时,程序就执行完了,所以第二次执行消费者时,加了个死循环,不停监听队列消息,具体ActiveMQ底层代码没看过,有兴趣的可以研究下,底层代码找到相应位置后,记得告诉我哦~~~)

  这个小问题,捣鼓一下午,百度上也说,就这2步骤配置即可,运行结果与初衷相违背,大半夜的都打算洗洗睡了,头脑风暴想出来这个方法,在下面写个死循环,不停监听队列消息,这才有了这篇博客,好啦...好啦,时间不早了,马上都快凌晨1点钟了,明个还得上班,洗洗睡了zZZZZZZZZZ

ActiveMQ 持久订阅者,执行结果与初衷相违背,验证离线订阅者无效,问题解决的更多相关文章

  1. Apache ActiveMQ Fileserver远程代码执行漏洞

    扫端口的时候遇到8161端口,输入admin/admin,成功登陆,之前就看到过相关文章,PUT了一句话上去,但是没有什么效果,于是本地搭建了一个环境,记录一下测试过程. 环境搭建: ActiveMQ ...

  2. 【漏洞预警】Apache ActiveMQ Fileserver远程代码执行漏洞(CVE-2016-3088)

    漏洞编码:CVE-2016-3088 实验环境:Linux Apache ActiveMQ版本号:Apache ActiveMQ 5.7.0 ----------------------------- ...

  3. SQLServer2005:在执行批处理时出现错误。错误消息为: 目录名无效

    删除数据时忘了想delete删除的话会记录日志,更何况是我删除百万条数据,结果还没删完服务器内存就占慢了,一切数据都进不来了,估计这种情况导致我的数据库有问题了,右键打开表提示:目录名无效,执行SQL ...

  4. sql server在执行批处理时出现错误。错误消息为: 目录名无效

    今天在客户服务器上的sql server上执行脚本,报错提示“在执行批处理时出现错误.错误消息为:目录名无效”,第一反应就是客户是不是在服务器装了360,因为之前有类似问题,360把数据库的文件给隔离 ...

  5. 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例

    这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题,  于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - S ...

  6. 下载一个vue项目执行npm install 后运行项目npm run dev后出错 - 问题解决

    在SVN上拉下来一个vue项目,上面没有提交项目里面的node_modules文件夹,所以要自己执行 npm install 安装,但安装完后运行项目后却报错了: $ npm run dev > ...

  7. EF执行存储工程报错 String[4]: Size 属性具有无效大小值 0。

    EF中执行存储过程报错 String[4]: Size 属性具有无效大小值 0 排查后是如下问题所致,给定的参数没有设定大小(加入红框内的就可以了) private string GetCode(MC ...

  8. 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证

    [数据删除及执行原生sql语句] delete()  返回受影响的记录条数 $goods -> delete(30);   删除主键值等于30的记录信息 $goods -> delete( ...

  9. loadrunner执行场景时报Error -27040: Data Format Extension: Init: Internal error问题解决

    [问题描述] 在loadrunner控制台执行场景时,所有用户均Failed,查看errors,错误原因如下: Error -27040: Data Format Extension: Init: I ...

随机推荐

  1. Python爬虫某招聘网站的岗位信息

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:阿尔法游戏 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  2. Gitflow分支管理策略

    Gitflow存在两个记录项目历史的分支 Master分支:存储(官方的,正式的)项目发布历史记录的分支. develop分支:充当功能的集成分支. Develop分支将包含项目的完整历史记录,而ma ...

  3. 代理模式是什么?如何在 C# 中实现代理模式

    代理模式 并不是日常开发工作中常常用到的一种设计模式,也是一种不易被理解的一种设计模式.但是它会广泛的应用在系统框架.业务框架中. 定义 它的 定义 就如其它同大部分 设计模式 的定义类似,即不通俗也 ...

  4. vue2.x学习笔记(十四)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12602256.html. 组件的Prop Prop是组件之间通信的一个重要途径,了解其知识十分重要. Prop的大 ...

  5. [HarekazeCTF2019] web

    在 buuoj 上看到的这个比赛题目,期间平台关了,就拿了 Dockerfile 本地做了,web 题目感觉还不错 encode_and_encode [100] 打开靶机,前两个页面都是 html ...

  6. MVC-路由解析

    MVC程序入口 Global.asax.cs 执行Application_Start 方法 *默认路由 *静态路由,访问链接只需要域名加路由url固定值就行了 *替换控制器,或方法名, *正则路由 方 ...

  7. TensorFlow-keras 100分类

    import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' from tensorflow.python.keras.datasets import cifa ...

  8. 数据挖掘入门系列教程(十点五)之DNN介绍及公式推导

    深度神经网络(DNN,Deep Neural Networks)简介 首先让我们先回想起在之前博客(数据挖掘入门系列教程(七点五)之神经网络介绍)中介绍的神经网络:为了解决M-P模型中无法处理XOR等 ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. [Inno Setup] Do not show application version in “Program and Features” control panel

    Set AppVersion empty. But, then you have to set the AppVerName. Depending on your needs either set i ...