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);

  

最新文章

  1. x01.os.21: print &quot;Loading...&quot;
  2. asp.net core输出中文乱码的问题
  3. ORA-12560: TNS: 协议适配器错误 ORA-12154: TNS: 无法解析指定的连接标识符
  4. git中忽略UserInterfaceState.xcuserstate的方法
  5. bzoj1036 [ZJOI2008]树的统计Count
  6. (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思
  7. 一种仿照Asp.net Mvc思维构建WebSocket服务器的方法
  8. bug集合
  9. Java [Leetcode 234]Palindrome Linked List
  10. 【LeetCode从零单排】No 3 Longest Substring Without Repeating Characters
  11. ActiveReports 9实战教程(2): 准备数据源(设计时、运行时)
  12. dist-upgrade
  13. 2.App Inventor 2编程流程
  14. qt集成dsoframer.ocx打开office办公软件
  15. 用HTML+CSS编写一个计科院网站首页的静态网页
  16. 应用MySQL(开启远程登录权限)
  17. java_免费视频课程汇总
  18. git 使用https 和SSH 提交远程库小总结
  19. PC/FORTH 编辑程序
  20. java项目性能测试过程记录

热门文章

  1. SQL Server-简单查询语句,疑惑篇
  2. WCF(二)配置文件
  3. linux进程的有效用户ID
  4. bzoj 3028: 食物 生成函数_麦克劳林展开
  5. CF960F Pathwalks_权值线段树_LIS
  6. css控制单行或者多行文本超出显示省略号
  7. zabbix_get 获取agnet端mysql数据失败
  8. MVC总结
  9. C# 实现窗口程序winform像QQ一样靠近桌面边缘自动隐藏窗口
  10. idea 编辑器 光标问题!(insert键)