当前位置: 首页 > news >正文

activemq使用

为什么80%的码农都做不了架构师?>>>   hot3.png

activemq使用

[toc]

1.延迟处理

需要修改activeMq的服务器中的conf/activemq.xml的配置

<broker xmlns="http://activemq.apache.org/schema/core" schedulerSupport="true"  brokerName="localhost" dataDirectory="${activemq.data}">

2. 确认机制,可以手工确认

prefetchSize暂时为1,optimizeACK不开启, 确认模式:CLIENT_ACKNOWLEDGE= 2 客户端手动确认 确认类型: STANDARD_ACK_TYPE = 2 标准类型(成功确认) REDELIVERED_ACK_TYPE = 3 消息需"重发",需配合重试设置

输入图片说明输入图片说明

consumer的session必须是配置acknowledege producer的session无需设置

 如果是多个consumer,使用不同的session
	 当前可以确认:
		 不同consumer如果使用同一个session(配置手动确认),不会重新接收到该条消息。
		 不同consumer如果使用不同session(配置手动确认),可以重新接收到该条消息,并可以手工确认。
		 不同consumer使用的session(没有配置手工确认),接收到没有被手工确认的消息会以自动确认接受
	待解决的问题:
		不同consumer 接受消息之间的时间间隔如果设置,从而确保消息不会被多次消费
【备注1】一个tomcat容器在spring中如果没有配置使用同一个jmsSession,在多listerner的情况下会出现上述问题
【备注2】在多个tomcat容器共享队列中,不同容器之间的listerner会导致出现上述

3. 持久化

配置文件中 输入图片说明

<persistenceAdapter>
     <kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

程序是决定是否持久化的根本

 @Test
public void persistent() throws JMSException {
    //消息生产者
    MessageProducer producer=session.createProducer(destination);
    TextMessage message=session.createTextMessage("测试手动确认");
    producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
    producer.send(message);

    System.out.println("消息发送成功");
}
  • 程序不配置任何的DeliveryMode(配送模式)
    • activemq.xml中配置persistenceAdapter -----> 持久化
      • kill 之后,重启,数据没有丢失
      • stop之后,重启,数据没有丢失
  • activemq.xml中无persistenceAdapter配置 ---> 不持久化
    • restart 数据丢失
  • 程序配置DeliveryMode为PERSISTENT (producer.setDeliveryMode(DeliveryMode.PERSISTENT);) 持久化
    • activemq.xml中配置persistenceAdapter -----> 持久化
    • activemq.xml中无persistenceAdapter配置 ---> 持久化
  • 程序配置DeliveryMode为NON_PERSISTENT (producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);)
    • activemq.xml中配置persistenceAdapter -----> 不持久化
    • restart 数据丢失
    • activemq.xml中无persistenceAdapter配置 ---> 不持久化
    • restart 数据丢失

设置activemq.xml中的broker为:

 <broker xmlns="http://activemq.apache.org/schema/core" schedulerSupport="true" persistent="false"  brokerName="localhost" dataDirectory="${activemq.data}">
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

restart 数据丢失

 producer.setDeliveryMode(DeliveryMode.PERSISTENT);

restart 数据丢失

3.1 处理持久化机制,采用storeCursor,处理设置阀值---内存大小

4.死信

如果不做任何说明,是不会启用死信队列的,测试了重试12次,依然

输入图片说明

下面测试需要增加死信的配置

 @Before
    public void deathInit() throws JMSException {
        RedeliveryPolicy queuePolicy=((ActiveMQConnection)connection).getRedeliveryPolicy();

        //设置默认的重发,之间的时间间隔,这个有望解决我代码中对于acknowledegement的问题,这块默认的时间是1s(1000ms)
        queuePolicy.setInitialRedeliveryDelay(0);
        // 设置重发延迟时间,如果InitialRedeliveryDelay=0,即生效
        queuePolicy.setRedeliveryDelay(2000);

        // 指数退避算法的 乘数
        queuePolicy.setBackOffMultiplier(5);
        // 是否启用指数退避算法 -指数增加超时时间
        queuePolicy.setUseExponentialBackOff(false);

        //设置最大的重试次数
        queuePolicy.setMaximumRedeliveries(2);

        connection=factory.createConnection();
        connection.start();

        //创建会话
        session=connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

        //创建队列
        destination=session.createQueue("TestLater");


    }

重试多次,仍然没有生效

然后在代码中增加

session.recover();

方才出现死信队列,即在正常情况下是不存在死信队列的。

输入图片说明输入图片说明

在这里配置的RedeliveryPolicy ,在不同session中,仍然在第一时间收到

不过这里设置的那个重试次数有效了,当重试2次就会放入死信队列中

转载于:https://my.oschina.net/dylw/blog/994721

相关文章:

  • 一个程序猿的遗嘱么?
  • Linux IO模式及 select、poll、epoll详解
  • bzoj 1600 amp; Usaco 月赛 2008 建造栅栏 题解
  • intellij idea svn 修改文件后,父文件夹也标注修改
  • VS 2015支持C语言和C++程序
  • springCloud(6):Eureka的自我保护模式、多网卡下的IP选择、Eureka的健康检查
  • 数据库笔试面试题库(Oracle、MySQL等)
  • Finance Theroy
  • lrzsz linix 远程文件传输工具。
  • SharePoint 2010中托管元数据
  • jsp下Kindeditor环境搭建
  • 如何为嵌入式开发建立交叉编译环境
  • 开始一段新的敏捷学习之旅 —— IT帮读书会第4期《Scrum实战》
  • CentOS7下安装MySQL5.7安装与配置(YUM)
  • 用hadoop实现SimRank++算法(1)----权值转移矩阵的计算
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Intervention/image 图片处理扩展包的安装和使用
  • Java多态
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Magento 1.x 中文订单打印乱码
  • Redis 懒删除(lazy free)简史
  • Selenium实战教程系列(二)---元素定位
  • Vue UI框架库开发介绍
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从零开始在ubuntu上搭建node开发环境
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 聊一聊前端的监控
  • 前端js -- this指向总结。
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Linux权限管理(week1_day5)--技术流ken
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #13 yum、编译安装与sed命令的使用
  • #ifdef 的技巧用法
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .describe() python_Python-Win32com-Excel
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET中 MVC 工厂模式浅析
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Resource和@Autowired的区别
  • [].slice.call()将类数组转化为真正的数组
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [Angularjs]asp.net mvc+angularjs+web api单页应用