农历(三月初三)
关于
友情链接
Toggle navigation
Harries Blog™
追心中的海,逐世界的梦
首页
编程技术
Java
软件架构
移动开发
后端
前端
大数据
数据库
算法
人工智能
测试
openclaw
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教程
memcached教程
Docker 教程
Quartz指南
Hive教程
Ant教程
java实例教程
SpringCloud
ANTLR教程
Hazelcast教程
Elastic-Job-Lite
深入浅出MyBatis
XStream教程
SVN教程
ibaties教程
rabittmq教程
solr教程
Hadoop教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
生活感悟
默认分类
博主自留地
一周一本书
一月一个人
互联网
互联网.出海
互联网.IPO
运维
Linux
docker
nginx
windows
操作系统
监控软件
虚拟化
vmware
tomcat
自动化
留言板
转载
发表于 2016年03月17日
浏览 (
2,800
)
评论 (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服务器
热门推荐
配置虚拟站点
浏览(10,195)
评论(20)
修改上传文件权限
浏览(11,570)
评论(18)
VPS 自我监控
浏览(10,377)
评论(23)
OpenVZ VPS 额外支持
浏览(10,439)
评论(17)
openfire数据库安装指南
浏览(19,916)
评论(0)
openfire协议支持指南
浏览(9,374)
评论(18)
openfire定制指南
浏览(11,483)
评论(17)
Caffe 深度学习框架上手教程
浏览(15,652)
评论(0)
ReactiveCocoa入门教程:第一部分
浏览(16,440)
评论(0)
开源HIDS-OSSEC使用实例:监测CC攻击
浏览(16,271)
评论(0)
相关文章
【ActiveMQ中文指南】第一章
【ActiveMQ中文指南】第二章
【ActiveMQ中文指南】第三章
【ActiveMQ中文指南】第四章
【ActiveMQ中文指南】第五章
【ActiveMQ中文指南】第六章
ActiveMQ中文指南
1
【ActiveMQ中文指南】第一章
2
【ActiveMQ中文指南】第二章
3
【ActiveMQ中文指南】第三章
4
【ActiveMQ中文指南】第四章
5
【ActiveMQ中文指南】第五章
6
【ActiveMQ中文指南】第六章
7
【ActiveMQ中文指南】第七章
说给你听
本文目录
随机标签
Jet engine
北京条约
回滚失败
trait
CST
Jsp当当购书网源码
硬件管理
漏水严重
swap
stresstester
定时任务
阅兵
k8s
免费通话
client
PropertyDescriptor
JAVA_OPTS
标签20
bus
Git Bash
同步
UDP
自由
JVM
英文原版PDF
医药
噪音
watch
参数
古老特征
互联网保险
Apache ab
spring
人才
AI
本土化
ifPresent
redis集群
GPT-3
井
内容创业
docker tag
ifPresent
openfire打包
灰色背景
集群
布隆过滤器
250定律
Java集合
自己动手实现IOC和MVC
validation
书籍教程
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教程
memcached教程
Docker 教程
Quartz指南
Hive教程
Ant教程
java实例教程
SpringCloud
ANTLR教程
Hazelcast教程
Elastic-Job-Lite
深入浅出MyBatis
XStream教程
SVN教程
ibaties教程
rabittmq教程
solr教程
Hadoop教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
近期评论
william
ws0132613@gmail.comhttps://getmacos.com/gopanel/william smith
Harrries
谢谢
vzxcv
https://www.newcmy.com/register?aff=HBVX建议您试试草莓云机场,可以流畅观看youtube和tiktok,上reddit/x也没有问题,还有各种ai优化节点。
admin
出现OpenClaw "device signature expired"。the Gateway rejects if Math.abs(Date.now() - signedAt) > 10 * 60 * 1000 (10 minutes)
admin
sudo apt updatesudo apt install postgresql-17 postgresql-contrib-17 -y
匿名
想购买您这个站,我的联系方式QQ741756694微信同步 能卖联系
Harrries
目前MCP 工具上并没有ssl设置,可以修改server.py手工禁用ssl
Harrries
主要用的是AI
Allen
博主的博客用的什么技术栈,内容都是干货,赞
Harrries
收到
随机文章
站长推荐
近期文章
1
C#的Socket简单实现消息发送
2
Spark 内核研究
3
iOS开发长文--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
4
etcd 2.0发布,大部分功能已稳定
5
设计模式之第17章-备忘录模式(Java实现)
6
老码农的技术理想
7
为什么Linux下多线程程序如此消耗虚拟内存
8
提前关于 React Native 的一些介绍
9
智能电视准备好了吗?YouTube 已默认采用 HTML5 视频技术
10
Android App 性能优化实践
1
VPS 自我监控
2
springboot接入多个ES启动时候自检报错
3
配置虚拟站点
4
openfire协议支持指南
5
修改上传文件权限
6
OpenVZ VPS 额外支持
7
2015年北京下第一场雪留念
8
openfire定制指南
9
mysql存储过程实例一:游标的使用
10
Linux删除或者新增SWAP分区
1
Claude Opus 4.7:一个开始“干活”的大模型
2
在 AI 快速发展的今天,“人还重要吗?
3
openclaw 连接 MySQL 实现数据分析
4
他用20年拿下WSBK冠军,而你还没开始做第一个产品
5
48小时打造一个类似 Product Hunt 的网站
6
BTCPay Server 安装部署完整指南(2026最新)
7
openclaw升级和参数调整
8
让 OpenClaw“自动发现并安装插件”
9
openclaw对接企业微信
10
90%的独立开发者死在这10件小事上
网站信息
文章总数:80,223 篇
文件总数:211,070 个
标签总数:2,521 个
分类总数:87 个
留言数量:2,598 条
在线人数:10 人
运行天数:4,921天
最后更新:2026年04月18日21点
×
输入密码查看文章详情
×
搜索文章
搜索
热门搜索:
Java
Springboot
Linux
Maven
Bootstrap
阿里云
×
评论信息框
可以通过QQ号实时获取昵称和头像
QQ
昵称
邮箱
网址
提交评论
×
山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍
支付宝
微信
转账时请备注"
博客赞助
"
Loading...