农历(十一月初二)
关于
友情链接
Toggle navigation
Harries Blog™
追心中的海,逐世界的梦
首页
编程技术
Java
软件架构
移动开发
后端
前端
大数据
数据库
算法
人工智能
测试
100 Days of AI Programming
代码管理
IT教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
springcloud-demo
Redis教程
Spring教程
Git教程
openfire参考指南
Jenkins进阶系列
Java设计模式
HBase教程
java-demo
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Ant教程
java实例教程
Hive教程
SpringCloud
ANTLR教程
XStream教程
Elastic-Job-Lite
Hazelcast教程
深入浅出MyBatis
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
生活感悟
默认分类
博主自留地
一周一本书
一月一个人
互联网
互联网.出海
互联网.IPO
运维
Linux
docker
nginx
windows
操作系统
监控软件
vmware
虚拟化
tomcat
自动化
留言板
转载
发表于 2016年03月17日
浏览 (
2,666
)
评论 (0)
【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已经成功地将消息持久化,而且不会丢失。但是这样作也严重地影响了性能。 如果你的系统可以容忍少量的消息丢失,那么可以在事务外发送持久消息的时候,选择使用异步方式。以下是几种不同的配置方式:
Java代码
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配置文件的一个例子:
Xml代码
<
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配置文件的一个例子:
Xml代码
<
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配置文件的一个例子:
Xml代码
<
destinationPolicy
>
<
policyMap
>
<
policyEntries
>
<
policyEntry
topic
=
"org.apache.>"
>
<
pendingSubscriberPolicy
>
<
vmCursor
/>
</
pendingSubscriberPolicy
>
<
PendingDurableSubscriberMessageStoragePolicy
>
<
vmDurableCursor
/>
</
PendingDurableSubscriberMessageStoragePolicy
>
</
policyEntry
>
</
policyEntries
>
</
policyMap
>
</
destinationPolicy
>
对于queue,可以使用的pendingQueuePolicy有vmQueueCursor 和 fileQueueCursor。以下是ActiveMQ配置文件的一个例子:
Xml代码
<
destinationPolicy
>
<
policyMap
>
<
policyEntries
>
<
policyEntry
queue
=
"org.apache.>"
>
<
pendingQueuePolicy
>
<
vmQueueCursor
/>
</
pendingQueuePolicy
>
</
policyEntry
>
</
policyEntries
>
</
policyMap
>
</
destinationPolicy
>
2.6.11 Optimized Acknowledgement ActiveMQ缺省支持批量确认消息。由于批量确认会提高性能,因此这是缺省的确认方式。如果希望在应用程序中禁止经过优化的确认方式,那么可以采用如下方法:
Java代码
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参数,如下:
Java代码
((ActiveMQConnectionFactory)cf).setProducerWindowSize(
1024000
);
ProducerWindowSize是producer在发送消息的过程中,收到broker对于之前发送消息的确认之前, 能够发送消息的最大字节数。你也可以禁用producer flow control,以下是ActiveMQ配置文件的一个例子:
Java代码
<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 接口用于进行消息转换,如下:
Java代码
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方法。
以下是个简单的例子:
Java代码
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,如下:
Java代码
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,如下:
Java代码
((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
;
}
});
正文到此结束
赞
0
赏
分享
本文标签:
destinationPolicy
Wildcards
ActiveMQ
版权声明:
本文为互联网转载文章,出处已在文章中说明(部分除外)。如果侵权,请
联系本站长
删除,谢谢。
本文海报:
生成海报一
生成海报二
上一篇
【ActiveMQ中文指南】第六章
下一篇
如何控制开放HTTPS服务的weblogic服务器
热门推荐
配置虚拟站点
浏览(9,392)
评论(20)
修改上传文件权限
浏览(10,991)
评论(18)
VPS 自我监控
浏览(9,756)
评论(23)
OpenVZ VPS 额外支持
浏览(9,864)
评论(17)
openfire数据库安装指南
浏览(19,459)
评论(0)
openfire定制指南
浏览(10,940)
评论(17)
Caffe 深度学习框架上手教程
浏览(15,221)
评论(0)
ReactiveCocoa入门教程:第一部分
浏览(16,045)
评论(0)
开源HIDS-OSSEC使用实例:监测CC攻击
浏览(15,929)
评论(0)
Decorators in ES7
浏览(20,604)
评论(4)
相关文章
【ActiveMQ中文指南】第一章
【ActiveMQ中文指南】第二章
【ActiveMQ中文指南】第三章
【ActiveMQ中文指南】第四章
【ActiveMQ中文指南】第五章
【ActiveMQ中文指南】第六章
ActiveMQ中文指南
1
【ActiveMQ中文指南】第一章
2
【ActiveMQ中文指南】第二章
3
【ActiveMQ中文指南】第三章
4
【ActiveMQ中文指南】第四章
5
【ActiveMQ中文指南】第五章
6
【ActiveMQ中文指南】第六章
7
【ActiveMQ中文指南】第七章
说给你听
本文目录
随机标签
40个建议
amqp
JetBrains
技术框架
Pexels
质量
三宗罪
ConfigurableServletWebServerFactory
汽车之家
solr-solrj
JobStores
multicast
大型語言模型
TiDB
core
中国区GitHub
DbUtils
Job 'Instances'
本土化
landingpage
Facebook
一致性哈希
关键词
数据
日常维护
模型
reCAPTCHA
开源
一致性
隐藏层
EmbeddedSolrServer
MQ
互惠的心理
IT人
deny
GitHub
BIO
Clustering
ElasticsearchRestClientConfigurations
标签12
公司制度
翻译
退休年龄
Jackson
feign-hystrix
AngularJS
参数处理
百度权重
电商网站
养生
设计欣赏
书籍教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
springcloud-demo
Redis教程
Spring教程
Git教程
openfire参考指南
Jenkins进阶系列
Java设计模式
HBase教程
java-demo
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Ant教程
java实例教程
Hive教程
SpringCloud
ANTLR教程
XStream教程
Elastic-Job-Lite
Hazelcast教程
深入浅出MyBatis
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
近期评论
Harrries
收到
果冻
https://www.liuhaihua.cn/archives/40657.html 这篇博客中的图片打不开了
wu先生
不会英语啊。
Harrries
前100名用户会展示特殊的纪念徽章
Harrries
需要魔法才能发打开,中国区不行
无往不利
https://pplx.ai/floraliu4199466 这个链接打不开是什么原因?
Harrries
5分钟 注册下载 登录 提一个问题,就可以找博主领取5块红包了,很简单
Harrries
可能有人安装的时候开了魔法也依然没办法安装,显示的是"等待网络连接解决方法:在存放安装包的目录下打开cmd,分别运行下面2个命令:set "https_proxy=http://127.0.0.1:1080"start "" ".\comet_installer_latest.exe"需要注意有一些科技用的不是1080端口,按需修改
Harrries
链接已添加
慕云
来看看,最近更新了一波,顺着友联过来的,几年过去了,网站越搞越好,厉害
随机文章
站长推荐
近期文章
1
为什么WordPress面对404攻击会如此脆弱
2
Xfce之所以大行其道的七大原因
3
swoole教程第一节:进程管理模块(Process)-中(消息队列)
4
解决Linq.ToDictionary()时的键重复问题
5
初探 MySQL 的 Binlog
6
Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾
7
Mabolo: 轻量级的 MongoDB ORM
8
Babel.js 插件开发(一):Babel 与 AST
9
最美应用:从 Android 研发工程师的角度之“最美时光”
10
C++11 标准新特性:委派构造函数
1
VPS 自我监控
2
springboot接入多个ES启动时候自检报错
3
配置虚拟站点
4
openfire协议支持指南
5
修改上传文件权限
6
OpenVZ VPS 额外支持
7
2015年北京下第一场雪留念
8
openfire定制指南
9
mysql存储过程实例一:游标的使用
10
Linux删除或者新增SWAP分区
1
AI 编码的常见问题:不是 AI 不行,而是人要更清醒
2
Claude CLI 使用指南(Step by Step)
3
基于 OpenSpec + Claude CLI 的实战开发指南
4
你看到什么,决定你成为什么
5
企业级 AI 编程 Prompt 体系
6
Google 登录问题排查指南
7
半天、200 元,我把自己的 App 做出来并上架了 App Store
8
Flutter + Supabase 接入 Google 登录
9
收到第一封推广邮件:我的 App 正在被看见
10
技术人最深的三大痛点:看见的人不多,说出口的人更少
网站信息
文章总数:80,190 篇
文件总数:210,977 个
标签总数:2,480 个
分类总数:86 个
留言数量:2,590 条
在线人数:602 人
运行天数:4,802天
最后更新:2025年12月20日17点
×
输入密码查看文章详情
×
搜索文章
搜索
热门搜索:
Java
Springboot
Linux
Maven
Bootstrap
阿里云
×
评论信息框
可以通过QQ号实时获取昵称和头像
QQ
昵称
邮箱
网址
提交评论
×
山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍
支付宝
微信
转账时请备注“
博客赞助
”
Loading...