博客
关于我
Day177.高级特性 -ActiveMQ
阅读量:330 次
发布时间:2019-03-04

本文共 1812 字,大约阅读时间需要 6 分钟。

ActiveMQ 高级特性

异步投递

异步投递是指生产者与Broker之间的消息发送过程与生产者执行其他任务并行。与传统的同步投递相比,异步投递允许生产者更快速地发送消息,但也伴随着消息发送成功不保证的风险。

异步投递特点

  • 不保证消息成功发送:异步投递无法确保每条消息都被Broker接收,可能会出现消息丢失的情况。
  • 可能导致消息积压:如果消费者(slow consumer)处理消息速度过慢,Broker可能会积压大量消息,影响性能。
  • 异步投递总结

    异步投递适合对消息处理速度要求较高的场景,但需要特别注意消息丢失和积压问题。在实际应用中,可以根据需求选择同步或异步投递方式。

    延迟投递和定时投递

    延迟投递允许生产者在指定时间发送消息,而定时投递则允许生产者在一定周期内重复发送消息。

    延迟投递配置

  • 修改配置文件:在activemq.xml中添加以下配置:
  • 重启activemq:完成配置后,重启Broker使其生效。
  • 定时投递实现

    生产者可以通过设置消息属性来实现定时投递:

    message.setProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, "3000"); // 延迟3秒message.setProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, "4000"); // 每4秒发送一次message.setProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, "5"); // 重复5次

    消息消费的重试机制

    消费者在遇到异常时,Broker会重试发送消息。默认情况下,最多重试6次,每次间隔1秒。

    消息重发条件

  • 事务处理异常:在事务中调用rollback。
  • 事务未提交:在事务提交前关闭Session或未 commit。
  • ACK模式下的Session恢复:在CLIENT_ACKNOWLEDGE模式下调用recover。
  • 消息重发次数和间隔

    默认重发次数为6次,间隔为1秒。

    有毒消息处理

    如果消息重发次数超过默认限制(6次),Broker会将其标记为有毒消息(poison ack),并将其放入死信队列(DLQ)。

    消息不被重复消费,幂等性

    幂等性是指消息在被消费之前不会被重复消费。可以通过消息ID来确保这一点。

    幂等性实现

    在消费者代码中,可以检查消息的JMSMessageID,避免重复消费:

    if (message instanceof TextMessage) {    TextMessage txtMsg = (TextMessage) message;    String msgId = txtMsg.getJMSMessageID();    // 根据msgId判断是否已消费}

    死信队列

    死信队列用于处理因消费者无法处理或异常导致的消息。Broker会自动将这些消息路由至死信队列。

    死信队列配置

  • 默认死信队列
  • 单独配置
  • 过期消息处理:可以通过设置消息的AMQ_SCHEDULED_EXPIRATION属性来指定消息过期时间。
  • 消息幂等性与重复消费

    幂等性是确保消息在被消费前不会被重复消费的机制。可以通过消息ID来实现,避免重复处理相同消息。

    幂等性实现

    在消费者代码中,可以检查消息的JMSMessageID,确保每条消息只被消费一次:

    if (session.createConsumer(queue, new MessageListener() {    public void onMessage(Message message) {        if (message instanceof TextMessage) {            TextMessage txtMsg = (TextMessage) message;            String msgId = txtMsg.getJMSMessageID();            // 根据msgId检查是否已消费        }    }});

    转载地址:http://nioq.baihongyu.com/

    你可能感兴趣的文章
    Spring 框架之 AOP 原理深度剖析
    查看>>
    Pandas:如何按列元素的组合分组,以指示基于不同列的值的同现?
    查看>>
    Pandas:将一列与数据帧的所有其他列进行比较
    查看>>
    PANDA:基于多列对数据表的行运行计算,并将输出存储在新列中
    查看>>
    PandoraFMS 监控软件 SQL注入漏洞复现
    查看>>
    PandoraFMS 监控软件 任意文件上传漏洞复现
    查看>>
    Papyrus项目常见问题解决方案
    查看>>
    Parallel.ForEach使用示例
    查看>>
    Parallel.ForEach的基础使用
    查看>>
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>
    Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
    查看>>
    Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
    查看>>
    Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
    查看>>