农历(十一月廿六)
毛泽东诞辰纪念
关于
友情链接
Toggle navigation
Harries Blog™
追心中的海,逐世界的梦
首页
编程技术
Java
软件架构
移动开发
后端
前端
大数据
数据库
算法
人工智能
测试
代码管理
IT教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
Redis教程
Spring教程
Git教程
Jenkins进阶系列
openfire参考指南
Java设计模式
HBase教程
java-demo
springcloud-demo
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Hive教程
ANTLR教程
SpringCloud
Ant教程
java实例教程
Hazelcast教程
XStream教程
Elastic-Job-Lite
深入浅出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,036
)
评论 (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服务器
热门推荐
openfire数据库安装指南
浏览(14,043)
评论(0)
Caffe 深度学习框架上手教程
浏览(10,701)
评论(0)
ReactiveCocoa入门教程:第一部分
浏览(11,525)
评论(0)
开源HIDS-OSSEC使用实例:监测CC攻击
浏览(11,440)
评论(0)
Decorators in ES7
浏览(15,985)
评论(4)
用Electron(Atom编辑器的兄弟项目)开发桌面应用
浏览(28,991)
评论(0)
Windows下JetBrains CLion中文输出乱码的解决方法
浏览(12,446)
评论(1)
同步-@synchronized, NSLock, pthread, OSSpinLock性能比较
浏览(11,400)
评论(0)
Seaweedfs之Volume读请求重定向
浏览(25,692)
评论(3)
HTML、CSS及JavaScript : 有Promise,不会搞大肚子
浏览(13,532)
评论(0)
相关文章
【ActiveMQ中文指南】第一章
【ActiveMQ中文指南】第二章
【ActiveMQ中文指南】第三章
【ActiveMQ中文指南】第四章
【ActiveMQ中文指南】第五章
【ActiveMQ中文指南】第六章
ActiveMQ中文指南
1
【ActiveMQ中文指南】第一章
2
【ActiveMQ中文指南】第二章
3
【ActiveMQ中文指南】第三章
4
【ActiveMQ中文指南】第四章
5
【ActiveMQ中文指南】第五章
6
【ActiveMQ中文指南】第六章
7
【ActiveMQ中文指南】第七章
说给你听
本文目录
随机标签
HBase
Windows Server 2003
双11
socket
delete
React AJAX
scala
工程师文化
Jackson
circular reference
插件市场
Zach Filkins
抄底收购
单元测试
分享式领导精益框架
AI
京东数据
年入 1 亿元
中文字体
element-ui
消息中间件系统
中国
wordpress
tika
Apache Samza
数据检索
银行
万物
全局唯一ID设计
开发
序列化
trait
分布式事务
标题
update
feign-hystrix
rsyslog
TINYINT
架构设计
百度权重
Haproxy
SpringBootBanner
BurstNET VPS
bus
文档生成能力
真实经历
scope
开发者大会
个人信息
FIT
noindex
书籍教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
Redis教程
Spring教程
Git教程
Jenkins进阶系列
openfire参考指南
Java设计模式
HBase教程
java-demo
springcloud-demo
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Hive教程
ANTLR教程
SpringCloud
Ant教程
java实例教程
Hazelcast教程
XStream教程
Elastic-Job-Lite
深入浅出MyBatis
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
近期评论
666
666
admin
文章和留言都翻到11页了 没有OOM
admin
我试一下
匿名
朋友,翻页到11页,及以后,会出现OOM,无法访问
可以
搞个gitee的项目
匿名
666
admin
版本号是多少,你可以下载哪个代码仓库,jdk选1.8 直接跑就行
极客青年
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demo.et.mysql.MysqlTests': Unsatisfied dependency expressed through field 'userMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'demo.et.mysql.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:393) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:119) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'demo.et.mysql.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ... 30 more
极客青年
原封不动的代码报错如下:
随机文章
站长推荐
近期文章
1
每日一博 | Erlang 之 entop 使用问题
2
网络暗黑世界的“域影”攻击:运营商劫持LOL等客户端海量级挂马
3
理解threadlocal
4
很快!红帽Linux企业版将支持高通ARM服务器
5
放心吧,人工智能还没那么可怕
6
浏览器与服务器的消息通信
7
在 Watson IoT Platform 中使用 Raspberry Pi 作为托管网关,第 1 部分
8
Android音频开发(2):如何采集一帧音频
9
apk 瘦身系列③:删除没用的资源文件
10
JSPatch 平台介绍
1
VPS 自我监控
2
springboot接入多个ES启动时候自检报错
3
配置虚拟站点
4
openfire协议支持指南
5
修改上传文件权限
6
OpenVZ VPS 额外支持
7
2015年北京下第一场雪留念
8
openfire定制指南
9
mysql存储过程实例一:游标的使用
10
Linux删除或者新增SWAP分区
1
mysql三种读取模式(普通、流式、游标)
2
Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题
3
Spring Cloud OpenFeign快速入门demo
4
使用 Docker 打包和运行 Vue 应用
5
Dependency Check命令行方式扫描jar包的安全漏洞
6
maven使用Dependency-Check来扫描安全漏洞
7
使用sonarqube分析代码质量
8
使用screw来对比数据库表和字段差异
9
Spring Boot 实现防盗链功能
10
在Spring Boot中的实现国际化(i18n)
网站信息
文章总数:82,740 篇
文件总数:284,316 个
标签总数:2,420 个
分类总数:85 个
留言数量:2,559 条
在线人数:676 人
运行天数:4,443天
最后更新:2024年12月26日17点
×
输入密码查看文章详情
×
搜索文章
搜索
热门搜索:
Java
Springboot
Linux
Maven
Bootstrap
阿里云
×
评论信息框
可以通过QQ号实时获取昵称和头像
QQ
昵称
邮箱
网址
提交评论
×
山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍
支付宝
微信
转账时请备注“
博客赞助
”
Loading...