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高级特性(一)的更多相关文章

  1. Python 学习笔记 之 02 - 高级特性总结

    切片 语法:  li.[x:y:z]  li为list.tuple等数据类型,x为开始进行切片的位置,y为切片停止的位置(不包含y),z为xy切片后的结果里,每间隔z个元素输出一次结果.  x默认为0 ...

  2. ActiveMQ学习笔记(5)——使用Spring JMS收发消息

      摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...

  3. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  4. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  5. SQL反模式学习笔记19 使用*号,隐式的列

    目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...

  6. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  7. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  8. C++ 学习笔记(一些新特性总结3)

    C++ 学习笔记(一些新特性总结3) public.protected 和 private 继承 public 继承时,基类的存取限制是不变的. class MyClass { public: // ...

  9. ActiveMQ学习笔记(15)----Message Dispatch高级特性(一)

    1. Message Cursors 1.1 概述 ActiveMQ发送持久化消息的典型的厝里方式是:当消息的消费者准备就绪时,消息发送系统把存储的消息按批次发送给消费者,在发送完一个批次的消息后,指 ...

  10. apache activemq 学习笔记

    0.activemq的概念 activemq实现了jms(java Message server),用于接收,发送,处理消息的开源消息总线. 1.activemq和jms的区别 jms说白了就是jav ...

随机推荐

  1. 洛谷P3358 最长k可重区间集问题(费用流)

    题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...

  2. python 3.x 学习笔记17(协程以及I/O模式)

    1.协程(微线程)协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上一 ...

  3. 【SQL优化】SQL优化工具

    SQLAdvisor 是由美团点评公司北京DBA团队开发维护的 SQL 优化工具:输入SQL,输出索引优化建议. 它基于 MySQL 原生词法解析,再结合 SQL 中的 where 条件以及字段选择度 ...

  4. Maintain Aspect Ratio Mixin

    Maintain Aspect Ratio Mixin Maintain the aspect ratio of a div with CSS RESPONSIVE ASPECT RATIOS WIT ...

  5. 杭电 1114 Piggy-Bank【完全背包】

    解题思路,首先很容易想到方程f[v]=min(f[v],f[v-w[i]+p[i]),因为是要求当包装满的时候(因为题目中给出的是包的质量是一定的),包里面装的钱最少,所以将f[]初始化成一个很大的数 ...

  6. offscreen-render

    offscreen-render 什么是offscreen-render?offscreen-render涉及的内容比较多,有offscreen-render那就有onscreen render,on ...

  7. Unity碰撞和触发的区别

    碰撞的必要条件: 2个都有Collider,且至少有一个刚体.带刚体的身上会检测OnCollision事件,stay就是2个一直在碰着. 触发的必要条件: 至少有一个碰撞器勾选了IsTrigger,至 ...

  8. Kattis - Virtual Friends(并查集)

    Virtual Friends These days, you can do all sorts of things online. For example, you can use various ...

  9. CF1012B Chemical table 构造_思维_并查集

    我们可以将横坐标和纵坐标看成是点.发现这些点之间是有传递性的. 题中说明,如果有矩阵中三个顶点被选,则底角的点也会被覆盖,发现这些点之间是有传递性的.那么我们最终达到的目的就是使整个图中只有 111 ...

  10. Pyhton学习——Day9(阶段性练习)

    # 1.文件内容如下,标题为:姓名,性别,年纪,薪资## egon male 18 3000# alex male 38 30000# wupeiqi female 28 20000# yuanhao ...