ActiveMQ in Action(7) - Wildcards
关键字: activemq
2.6.7 Wildcards
Wildcards用来支持联合的名字分层体系(federated name hierarchies)。它不是JMS规范的一部分,而是ActiveMQ的扩展。ActiveMQ支持以下三种wildcards:
- "." 用于作为路径上名字间的分隔符。
- "*" 用于匹配路径上的任何名字。
- ">" 用于递归地匹配任何以这个名字开始的destination。
作为一种组织事件和订阅感兴趣那部分信息的一种方法,这个概念在金融市场领域已经流行了一段时间了。设想你有以下两个destination:
- PRICE.STOCK.NASDAQ.IBM (IBM在NASDAQ的股价)
- PRICE.STOCK.NYSE.SUNW (SUN在纽约证券交易所的股价)
订阅者可以明确地指定destination的名字来订阅消息,或者它也可以使用wildcards来定义一个分层的模式来匹配它希望订阅的destination。例如:
| Subscription | Meaning |
| PRICE.> | Any price for any product on any exchange |
| PRICE.STOCK.> | Any price for a stock on any exchange |
| PRICE.STOCK.NASDAQ.* | Any stock price on NASDAQ |
| PRICE.STOCK.*.IBM | Any IBM stock price on any exchange |
2.6.8 Async Sends
ActiveMQ支持以同步(sync)方式或者异步(async)方式向broker发送消息。 使用何种方式对send方法的延迟有巨大的影响。对于生产者来说,既然延迟是决定吞吐量的重要因素,那么使用异步发送方式会极大地提高系统的性能。
ActiveMQ缺省使用异步传输方式。但是按照JMS规范,当在事务外发送持久化消息的时候,ActiveMQ会强制使用同步发送方式。在这种情况下,每一次发送都是同步的,而且阻塞到收到broker的应答。这个应答保证了broker已经成功地将消息持久化,而且不会丢失。但是这样作也严重地影响了性能。
如果你的系统可以容忍少量的消息丢失,那么可以在事务外发送持久消息的时候,选择使用异步方式。以下是几种不同的配置方式:
- cf = new ActiveMQConnectionFactory("tcp://locahost:61616?jms.useAsyncSend=true");
- ((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);
- ((ActiveMQConnection)connection).setUseAsyncSend(true);
2.6.9 Dispatch Policies
2.6.9.1 Round Robin Dispatch Policy
在2.6.4小节介绍过ActiveMQ的prefetch机制,ActiveMQ的缺省参数是针对处理大量消息时的高性能和高吞吐量而设置的。所以缺省的prefetch参数比较大,而且缺省的dispatch policies会尝试尽可能快的填满prefetch缓冲。然而在有些情况下,例如只有少量的消息而且单个消息的处理时间比较长,那么在缺省的prefetch和dispatch policies下,这些少量的消息总是倾向于被分发到个别的consumer上。这样就会因为负载的不均衡分配而导致处理时间的增加。
Round robin dispatch policy会尝试平均分发消息,以下是ActiveMQ配置文件的一个例子:
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry topic="FOO.>">
- <dispatchPolicy>
- <roundRobinDispatchPolicy />
- </dispatchPolicy>
- </policyEntry>
- </policyEntries>
- </policyMap>
- </destinationPolicy>
2.6.9.2 Strict Order Dispatch Policy
有时候需要保证不同的topic consumer以相同的顺序接收消息。通常ActiveMQ会保证topic consumer以相同的顺序接收来自同一个producer的消息。然而,由于多线程和异步处理,不同的topic consumer可能会以不同的顺序接收来自不同producer的消息。例如有两个producer,分别是P和Q。差不多是同一时间内,P发送了P1、P2和P3三个消息;Q发送了Q1和Q2两个消息。两个不同的consumer可能会以以下顺序接收到消息:
consumer1: P1 P2 Q1 P3 Q2
consumer2: P1 Q1 Q2 P2 P3
Strict order dispatch policy 会保证每个topic consumer会以相同的顺序接收消息,代价是性能上的损失。以下是采用了strict order dispatch policy后,两个不同的consumer可能以以下的顺序接收消息:
consumer1: P1 P2 Q1 P3 Q2
consumer2: P1 P2 Q1 P3 Q2
以下是ActiveMQ配置文件的一个例子:
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry topic=""FOO.>">
- <dispatchPolicy>
- <strictOrderDispatchPolicy />
- </dispatchPolicy>
- </policyEntry>
- </policyEntries>
- </policyMap>
- </destinationPolicy>
2.6.10 Message Cursors
当producer发送的持久化消息到达broker之后,broker首先会把它保存在持久存储中。接下来,如果发现当前有活跃的consumer,而且这个consumer消费消息的速度能跟上producer生产消息的速度,那么ActiveMQ会直接把消息传递给broker内部跟这个consumer关联的dispatch queue;如果当前没有活跃的consumer或者consumer消费消息的速度跟不上producer生产消息的速度,那么ActiveMQ会使用Pending Message Cursors保存对消息的引用。在需要的时候,Pending Message Cursors把消息引用传递给broker内部跟这个consumer关联的dispatch queue。以下是两种Pending Message Cursors:
- VM Cursor。在内存中保存消息的引用。
- File Cursor。首先在内存中保存消息的引用,如果内存使用量达到上限,那么会把消息引用保存到临时文件中。
在缺省情况下,ActiveMQ 5.0根据使用的Message Store来决定使用何种类型的Message Cursors,但是你可以根据destination来配置Message Cursors。
对于topic,可以使用的pendingSubscriberPolicy 有vmCursor和fileCursor。可以使用的PendingDurableSubscriberMessageStoragePolicy有vmDurableCursor 和 fileDurableSubscriberCursor。以下是ActiveMQ配置文件的一个例子:
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry topic="org.apache.>">
- <pendingSubscriberPolicy>
- <vmCursor />
- </pendingSubscriberPolicy>
- <PendingDurableSubscriberMessageStoragePolicy>
- <vmDurableCursor/>
- </PendingDurableSubscriberMessageStoragePolicy>
- </policyEntry>
- </policyEntries>
- </policyMap>
- </destinationPolicy>
对于queue,可以使用的pendingQueuePolicy有vmQueueCursor 和 fileQueueCursor。以下是ActiveMQ配置文件的一个例子:
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry queue="org.apache.>">
- <pendingQueuePolicy>
- <vmQueueCursor />
- </pendingQueuePolicy>
- </policyEntry>
- </policyEntries>
- </policyMap>
- </destinationPolicy>
2.6.11 Optimized Acknowledgement
ActiveMQ缺省支持批量确认消息。由于批量确认会提高性能,因此这是缺省的确认方式。如果希望在应用程序中禁止经过优化的确认方式,那么可以采用如下方法:
- cf = new ActiveMQConnectionFactory ("tcp://locahost:61616?jms.optimizeAcknowledge=false");
- ((ActiveMQConnectionFactory)connectionFactory).setOptimizeAcknowledge(false);
- ((ActiveMQConnection)connection).setOptimizeAcknowledge(false);
2.6.12 Producer Flow Control
同步发送消息的producer会自动使用producer flow control ;对于异步发送消息的producer,要使用producer flow control,你先要为connection配置一个ProducerWindowSize参数,如下:
- );
ProducerWindowSize是producer在发送消息的过程中,收到broker对于之前发送消息的确认之前, 能够发送消息的最大字节数。你也可以禁用producer flow control,以下是ActiveMQ配置文件的一个例子:
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry topic="FOO.>" producerFlowControl="false">
- <dispatchPolicy>
- <strictOrderDispatchPolicy/>
- </dispatchPolicy>
- </policyEntry>
- </policyEntries>
- </policyMap>
- </destinationPolicy>
2.6.13 Message Transformation
有时候需要在JMS provider内部进行message的转换。从4.2版本起,ActiveMQ 提供了一个MessageTransformer 接口用于进行消息转换,如下:
- public interface MessageTransformer {
- Message producerTransform(Session session, MessageProducer producer, Message message) throws JMSException;
- Message consumerTransform(Session session, MessageConsumer consumer, Message message)throws JMSException;
- }
通过在以下对象上通过调用setTransformer方法来设置MessageTransformer:
- ActiveMQConnectionFactory
- ActiveMQConnection
- ActiveMQSession
- ActiveMQMessageConsumer
- ActiveMQMessageProducer
MessageTransformer接口支持:
- 在消息被发送到JMS provider的消息总线前进行转换。通过producerTransform方法。
- 在消息到达消息总线后,但是在consumer接收到消息前进行转换。通过consumerTransform方法。
以下是个简单的例子:
- public class SimpleMessage implements Serializable {
- //
- private static final long serialVersionUID = 2251041841871975105L;
- //
- private String id;
- private String text;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getText() {
- return text;
- }
- public void setText(String text) {
- this.text = text;
- }
- }
在producer内发送ObjectMessage,如下:
- SimpleMessage sm = new SimpleMessage();
- sm.setId("1");
- sm.setText("this is a sample message");
- ObjectMessage message = session.createObjectMessage();
- message.setObject(sm);
- producer.send(message);
在consumer的session上设置一个MessageTransformer用于将ObjectMessage转换成TextMessage,如下:
- ((ActiveMQSession)session).setTransformer(new MessageTransformer() {
- public Message consumerTransform(Session session, MessageConsumer consumer, Message message) throws JMSException {
- ObjectMessage om = (ObjectMessage)message;
- XStream xstream = new XStream();
- xstream.alias("simple message", SimpleMessage.class);
- String xml = xstream.toXML(om.getObject());
- return session.createTextMessage(xml);
- }
- public Message producerTransform(Session session, MessageProducer consumer, Message message) throws JMSException {
- return null;
- }
- });
ActiveMQ in Action(7) - Wildcards的更多相关文章
- 《ActiveMQ in Action》【PDF】下载
内容介绍TheApache ActiveMQ message broker is an open source implementation ofthe Java Message Service sp ...
- ActiveMQ(5.10.0) - Wildcards and composite destinations
In this section we’ll look at two useful features of ActiveMQ: subscribing to multiple destinations ...
- ActiveMQ in Action(1) - JMS
关键字: activemq 1 JMS 在介绍ActiveMQ之前,首先简要介绍一下JMS规范.1.1 JMS的基本构件1.1.1 连接工厂 连接工厂是客户用来创建连接的对象,例如Acti ...
- ActiveMQ in Action(6) - Features
关键字: activemq 2.6 Features ActiveMQ包含了很多功能强大的特性,下面简要介绍其中的几个.2.6.1 Exclusive Consumer Queue中的消息 ...
- ActiveMQ in Action(5) - Clustering
关键字: activemq 2.5 Clustering ActiveMQ从多种不同的方面提供了集群的支持.2.5.1 Queue consumer clusters ActiveMQ支持 ...
- ActiveMQ in Action(3) - Persistence
关键字: activemq 2.3 Persistence2.3.1 AMQ Message Store AMQ Message Store是ActiveMQ5.0缺省的持久化存储.Messag ...
- ActiveMQ in Action(4) - Security
关键字: activemq 2.4 Security ActiveMQ支持可插拔的安全机制,用以在不同的provider之间切换.2.4.1 Simple Authentication Plug ...
- ActiveMQ in Action(2) - Transport
关键字: activemq 2.2 Transport ActiveMQ目前支持的transport有:VM Transport.TCP Transport.SSL Transport.Peer ...
- 《ActiveMQ in Action》例子
本章内容: 介绍本书中所有例子的使用场景 使用 Maven 编译.运行例子 例子中怎么使用 ActiveMQ 简介 ActiveMQ 不仅实现了 JMS 规范中定义的所有特性,也额外提供了一些特有且有 ...
随机推荐
- ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇]
ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇] 我们知道ASP.NET Web API借助于HttpSelfHostServer以Self Host模式寄宿于当 ...
- ARP 和 RARP
ARP 和 RARP 1.ARP 地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确地址解析协议定其物理地址的一种协议. 在 ...
- IOS开发笔记 - 基于SDWebImage的网络图片加载处理
前言: 在IOS下通过URL读一张网络图片并不像Asp.net那样可以直接把图片路径放到图片路径的位置就ok, 而是需要我们通过一段类似流的方式去加载网络图片,接着才能把图片放入图片路径显示. 这里找 ...
- 第一章 引言--《设计模式-可复用面向对象软件的基础》Erich Gamma
第一章 引言 本章主要是让我们大致明白设计模式是干嘛用的,模式分类,设计模式如何解决设计问题以及几种常见的面向对象设计中软件的复用方法. 1.什么是设计模式? 个人理解概括,设计模式是对一类问题的抽象 ...
- 高可用的池化 Thrift Client 实现(源码分享)
本文将分享一个高可用的池化 Thrift Client 及其源码实现,欢迎阅读源码(Github)并使用,同时欢迎提出宝贵的意见和建议,本人将持续完善. 本文的主要目标读者是对 Thrift 有一定了 ...
- MVC源码解析 - UrlRoutingModule / 路由注册
从前面篇章的解析, 其实能看的出来, IHttpModule 可以注册很多个, 而且可以从web.config注册, 可以动态注册. 但是有一个关键性的Module没有讲, 这里就先来讲一下这个关键性 ...
- codevs1069关押罪犯(并查集)
题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 ...
- U3D简单得换装技术
四个类完成,前提是 资源得名字配合 UI按钮点击响应类 using UnityEngine; using System.Collections; public class ButtonClickHan ...
- D3.js:完整的柱形图
一个完整的柱形图包含三部分:矩形.文字.坐标轴.本章将对前几章的内容进行综合的运用,制作一个实用的柱形图,内容包括:选择集.数据绑定.比例尺.坐标轴等内容. (1) 添加SVG画布 //画布大小 va ...
- Object-Widgets-Quick 构造树
Object Tree 当以某个QObject为父类创建一个QObject时, 它会被添加到该父类的children列表中. 析构时, QObjet 会首先检查自己的children, 依次析构, 然 ...