农历(二月廿二)
关于
友情链接
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,788
)
评论 (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
赏
分享
本文标签:
ActiveMQ
destinationPolicy
Wildcards
版权声明:
本文为互联网转载文章,出处已在文章中说明(部分除外)。如果侵权,请
联系本站长
删除,谢谢。
本文海报:
生成海报一
生成海报二
上一篇
【ActiveMQ中文指南】第六章
下一篇
如何控制开放HTTPS服务的weblogic服务器
热门推荐
配置虚拟站点
浏览(10,121)
评论(20)
修改上传文件权限
浏览(11,524)
评论(18)
VPS 自我监控
浏览(10,330)
评论(23)
OpenVZ VPS 额外支持
浏览(10,402)
评论(17)
openfire数据库安装指南
浏览(19,885)
评论(0)
openfire协议支持指南
浏览(9,331)
评论(18)
openfire定制指南
浏览(11,442)
评论(17)
Caffe 深度学习框架上手教程
浏览(15,622)
评论(0)
ReactiveCocoa入门教程:第一部分
浏览(16,413)
评论(0)
开源HIDS-OSSEC使用实例:监测CC攻击
浏览(16,243)
评论(0)
相关文章
【ActiveMQ中文指南】第一章
【ActiveMQ中文指南】第二章
【ActiveMQ中文指南】第三章
【ActiveMQ中文指南】第四章
【ActiveMQ中文指南】第五章
【ActiveMQ中文指南】第六章
ActiveMQ中文指南
1
【ActiveMQ中文指南】第一章
2
【ActiveMQ中文指南】第二章
3
【ActiveMQ中文指南】第三章
4
【ActiveMQ中文指南】第四章
5
【ActiveMQ中文指南】第五章
6
【ActiveMQ中文指南】第六章
7
【ActiveMQ中文指南】第七章
说给你听
本文目录
随机标签
HeyGen
Ryan Tedde
OCBC
sql
screw
Y-Combinator
自由快递人
JVM
行为偏激
代码生成器
性能优化
互联网企业
supabase
schema
hazelcast.xml
ApplicationRunner
部署
十年
评论推广
Office
Disruptor
规则引擎
node多版本
bigdata 3.0
高并发
C3P0
python
Rete algorithm
非静态方法
Android中文API
nvm
沈南鹏
Drew Brown
小米
汽车之家
调度器
拼命奔跑
java annotation
RFC3920
TLSv1.2
rmi
m2eclipse
骚扰电话拒接
zuul
风控系统
1000美元
工资差距
struct
监控CPU
xmpp协议
ESB研究
书籍教程
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
Foundation中的断言处理
2
站在移动互联时代的十字路口上_deviceone
3
《Hadoop核心技术》作者翟周伟 :我与Hadoop的不解之缘
4
HTTP/2 新特性浅析
5
RT-Thread v2.1.0alpha 技术预览,智能设备操作系统
6
从零到一,美芽的技术实战
7
2015/5/13 ViewPager切换效果
8
微软Build大会有感:Windows UAP开始让人惊喜
9
利用PostgreSQL实现毫秒级全文检索
10
代码审查最佳实践
1
VPS 自我监控
2
springboot接入多个ES启动时候自检报错
3
配置虚拟站点
4
openfire协议支持指南
5
修改上传文件权限
6
OpenVZ VPS 额外支持
7
2015年北京下第一场雪留念
8
openfire定制指南
9
mysql存储过程实例一:游标的使用
10
Linux删除或者新增SWAP分区
1
openclaw 连接 MySQL 实现数据分析
2
他用20年拿下WSBK冠军,而你还没开始做第一个产品
3
48小时打造一个类似 Product Hunt 的网站
4
BTCPay Server 安装部署完整指南(2026最新)
5
openclaw升级和参数调整
6
让 OpenClaw“自动发现并安装插件”
7
openclaw对接企业微信
8
90%的独立开发者死在这10件小事上
9
独立开发者最浪费时间的10件事
10
我用一个SaaS模板做了个小工具,第一个月赚了$3200
网站信息
文章总数:80,220 篇
文件总数:211,070 个
标签总数:2,520 个
分类总数:87 个
留言数量:2,598 条
在线人数:601 人
运行天数:4,912天
最后更新:2026年04月09日10点
×
输入密码查看文章详情
×
搜索文章
搜索
热门搜索:
Java
Springboot
Linux
Maven
Bootstrap
阿里云
×
评论信息框
可以通过QQ号实时获取昵称和头像
QQ
昵称
邮箱
网址
提交评论
×
山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍
支付宝
微信
转账时请备注“
博客赞助
”
Loading...