zoukankan      html  css  js  c++  java
  • ActiveMQ学习笔记(19)----Consumer高级特性(一)

    1. Exclusive Consumer

      独有消费者:Queue中的消息是按照顺序被分发到consumer的,然而,当你有多个consumers同时从相同的queue中提取消息时,你将失去这个保证。因为这些消息是被多个线程并发的处理。有的时候,保证消息按照顺序处理是很重要的。例如:你可能不希望在插入订单操作结束之前执行更新这个订单的操作。

      ActiveMQ从4.x版本开始支持Exclusive Consumer。Broker会从多个Consumers中挑选一个consumer来处理queue中所有的消息,从而保证了消息的有序处理。如果这个consumer失效,那么broker会自动切换到其他的consumer。可以通过destination options来创建一个Exclusive Consumer,如下:

    queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
    consumer = session.createConsumer(queue);

      还可以给consumer设置优先级,以便针对网络情况进行优化,如下:

    queue = new  ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true&consumer.priority=10");

    2. Consumer Dispatche Async

      在activemq4.0以后,你可以选择broker同步或异步的把消息分发给消费者。可以设置dispatchAsync属性,默认是true,通常情况下这是最佳的。

      你也可以通过如下几种方式修改:

      1. 在ConnectionFactory层设置

      ActiveMQConnectionFactory.setDispatchAsync(false);

      2. 在Connection上设置,这个设置将会覆盖ConnectionFactory上的设置

      ActiveMQConnetion.setDispatchAsync(false);

      3. 在Consumer上设置

      queue = new ActiveMQQueue("TEST.QUEUE?consumer.dispatchAsync=false");

      consumer = session.createConsumer(queue);

    3. Consumer Priority

      JMS JMSPriority定义了十个消息优先级值,0是最低优先级,9是最高优先级,另外,客户端应当将0-4看作普通优先级,5-9看作加急优先级。

      自定义Consumer Priority优先级。配置如下:

      queue = new ActiveMQQueue("TEST.QUEUE?consumer.priority=10");

      consumer = session.createConsumer(queue);

      Consumer的Priority的划分为0~127个级别,127是最高的级别,0是最低的也是ActiveMQ默认的。这种配置可以让Broker根据consumer的优先级来发送消息到较高的优先级的Consumer上,如果某个较高的Consumer的消息转载慢,则Broker会把消息发送到仅次于它优先级的Consumer上。

    4. Manage Durable Subscribers

      消息持久化,保证了消费者离线之后,再次进入系统,不会错过消息,但是这也会消耗很多的资源,从5.6开始,可以对持久化进行如下管理:

      Removing inactive subscribers

      我们还希望可以删除那些不活动的订阅者,如下:

    <broker name="localhost" offlineDurableSubscriberTimeout="86400000" offlineDurableSubscriberTaskSchedule="3600000">

      1.offlineDurableSubscriberTimeout:离线多长时间就过期删除,缺省是-1,就是不删除。

      2. offlineDurableSubscriberTaskSchedule: 多长时间检查一次,缺省300000,单位毫秒。

    5. Message Groups

      Message Goups就是对消息分组,它是Exclusive Consumer功能的增强。

      逻辑上Message Groups可以看成是一种并发的Exclusive Consumer。跟所有的消息都由唯一的consumer处理不同,JMS消息属性的JMSXGroupID用来区分message group.

      Message Group特性保证所有具有相同JMSXGroupID的消息 都会被分发到相同的consumer(只要这个consumer保持active).

      另一方面,Message Groups特性也是一种负载均衡的机制。在一个消息被分发到consumer之前,broker首先检查消息JMSXGroupID属性。如果存在,那么broker会检查是否有某个consumer拥有这个message group.如果没有,那么broker会选择一个consumer,并将它关联到这个message group.此后,这个consumer会接收到这个message group的所有消息,直到:

      1. consumer被关闭

      2. Message group被关闭,通过发送一个消息,并设置这个消息的JMSXGroupSeq为-1

      创建一个Message Groups,只需要在message对象上设置属性即可,如下:

      message.setStringProperty("JMSXGroupID","GroupA");

      关闭一个Message Groups,只需要在message对象上设置属性即可,如下:

      message.setStringProperty("JMSXGroupID","GroupA");

      message.setIntProperty("JMSXGroupSeq",-1);

      

    原文 ActiveMQ学习笔记(19)----Consumer高级特性(一)

  • 相关阅读:
    2-python数据分析-基于pandas的数据清洗、DataFrame的级联与合并操作
    1-2-python数据分析-DataFrame基础操作巩固-股票分析、双均线策略制定
    1-python数据分析-数据分析三剑客之Pandas基础操作
    单例模式
    装饰器模式
    适配器模式
    es通用工具类ElasticSearchUtil
    ELK+RabbitMq搭建日志系统
    redis能保证数据100%不丢失吗?
    面试官问你redis是单线程还是多线程该怎么回答?
  • 原文地址:https://www.cnblogs.com/xiaoshen666/p/10854718.html
Copyright © 2011-2022 走看看