activemq使用

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

版权声明:本文为weixin_33906657原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33906657/article/details/91589698

智能推荐

Intellij IDEA 搭建Spring Boot项目(一)

Intellij IDEA 搭建Spring Boot项目 标签(空格分隔): SpringBoot JAVA后台 第一步 选择File –> New –> Project –>Spring Initialer –> 点击Next  第二步 自己修改 Group 和 Artif...

CentOS学习之路1-wget下载安装配置

参考1: https://blog.csdn.net/zhaoyanjun6/article/details/79108129 参考2: http://www.souvc.com/?p=1569 CentOS学习之路1-wget下载安装配置 1.wget的安装与基本使用 安装wget yum 安装软件 默认安装保存在/var/cache/yum ,用于所有用户使用。 帮助命令 基本用法 例子:下载...

深入浅出Spring的IOC容器,对Spring的IOC容器源码进行深入理解

文章目录 DispatcherServlet整体继承图 入口:DispatcherServlet.init() HttpServletBean.init() FrameworkServlet.initServletBean() 首先大家,去看Spring的源码入口,第一个就是DispatcherServlet DispatcherServlet整体继承图 入口:DispatcherServlet....

laravel框架的课堂知识点概总

1. MVC 1.1 概念理解 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑 MVC 是一种使用 MVC(Model View Controller ...

Unity人物角色动画系统学习总结

使用动画系统控制人物行走、转向、翻墙、滑行、拾取木头 混合树用来混合多个动画 MatchTarget用来匹配翻墙贴合墙上的某一点,人物以此为支点翻墙跳跃 IK动画类似于MatchTarget,控制两只手上的两个点来指定手的旋转和位置,使得拾取木头时更逼真 创建AnimatorController: 首先创建一个混合树,然后双击 可以看到该混合树有五种状态机,分别是Idle、WalkForward、...

猜你喜欢

Composer 安装 ThinkPHP6 问题

Composer 安装 ThinkPHP6 问题 先说说问题 一.运行环境要求 二.配置 参考: ThinkPHP6.0完全开发手册 先说说问题 执行ThinkPHP6的安装命令 遇到问题汇总如下: 看提示是要更新版本,执行命令更新。 更新之后,再次安装ThinkPHP,之后遇到如下问题。 尝试了很多方法,依然不能解决。其中包括使用https://packagist.phpcomposer.com...

Spring Boot 整合JDBC

今天主要讲解一下SpringBoot如何整合JDBC,没啥理论好说的,直接上代码,看项目整体结构 看一下对应的pom.xml 定义User.java 定义数据源配置,这里使用druid,所以需要写一个配置类 上面指定druid的属性配置,和用户登录的账号信息以及对应的过滤规则: 下面定义数据访问接口和对应的实现: 数据访问层很简单,直接注入JdbcTemplate模板即可,下面再看对应的servi...

html鼠标悬停显示样式

1.显示小手:     在style中添加cursor:pointer 实现鼠标悬停变成小手样式     实例:         其他参数: cursor语法: cursor : auto | crosshair | default | hand | move | help | wait | tex...

Yupoo(又拍网)的系统架构

Yupoo!(又拍网) 是目前国内最大的图片服务提供商,整个网站构建于大量的开源软件之上。以下为其使用到的开源软件信息: 操作系统:CentOS、MacOSX、Ubuntu 服务器:Apache、Nginx、Squid 数据库:MySQLmochiweb、MySQLdb 服务器监控:Cacti、Nagios、 开发语言:PHP、Python、Erlang、Java、Lua 分布式计算:Hadoop...

创建一个Servlet项目流程(入门)

版本 IDEA 2020.2 JDK1.8 apache-tomcat-9.0.36 项目流程 一、IDEA中新建JaveEE项目 项目起名,选择项目存放地址,点击finish创建成功 进入项目后,右键选择项目,选择add Framework Support 选择Web Application,点击OK 此时项目文件夹 在WEB-INF下创建两个目录classes和lib 按ctrl+alt+sh...