农历(十月廿三)
关于
友情链接
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教程
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
springcloud-demo
Hive教程
Ant教程
ANTLR教程
SpringCloud
java实例教程
XStream教程
Hazelcast教程
Elastic-Job-Lite
深入浅出MyBatis
SVN教程
ibaties教程
rabittmq教程
solr教程
Hadoop教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
java-demo
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
生活感悟
默认分类
博主自留地
一周一本书
一月一个人
互联网
互联网.出海
互联网.IPO
运维
Linux
docker
nginx
windows
监控软件
操作系统
tomcat
虚拟化
vmware
自动化
留言板
转载
发表于 2016年03月17日
浏览 (
1,942
)
评论 (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数据库安装指南
浏览(13,754)
评论(0)
Caffe 深度学习框架上手教程
浏览(10,463)
评论(0)
ReactiveCocoa入门教程:第一部分
浏览(11,294)
评论(0)
开源HIDS-OSSEC使用实例:监测CC攻击
浏览(11,202)
评论(0)
Decorators in ES7
浏览(15,746)
评论(4)
用Electron(Atom编辑器的兄弟项目)开发桌面应用
浏览(28,770)
评论(0)
Windows下JetBrains CLion中文输出乱码的解决方法
浏览(12,223)
评论(1)
同步-@synchronized, NSLock, pthread, OSSpinLock性能比较
浏览(11,186)
评论(0)
Seaweedfs之Volume读请求重定向
浏览(25,462)
评论(3)
HTML、CSS及JavaScript : 有Promise,不会搞大肚子
浏览(13,324)
评论(0)
相关文章
【ActiveMQ中文指南】第一章
【ActiveMQ中文指南】第二章
【ActiveMQ中文指南】第三章
【ActiveMQ中文指南】第四章
【ActiveMQ中文指南】第五章
【ActiveMQ中文指南】第六章
ActiveMQ中文指南
1
【ActiveMQ中文指南】第一章
2
【ActiveMQ中文指南】第二章
3
【ActiveMQ中文指南】第三章
4
【ActiveMQ中文指南】第四章
5
【ActiveMQ中文指南】第五章
6
【ActiveMQ中文指南】第六章
7
【ActiveMQ中文指南】第七章
说给你听
本文目录
随机标签
OpenVZ
Lombok
Queues.drain
Select
DNS Lookup
JVM
Jackson
Agent
软件
珍爱
E1子对象的E2。
目录
WebSecurity
微商营销
PropertyDescriptor
Kibana
solrconfig.xml
wp-autopost-pro
部署
Stocksnap
Statement
雾霾
zxing
bug
递归
React 列表
调试
jsoup
万事达卡
包混叠
openapi
webflux
entity
Apache Mesos
中层管理
TTL索引
数据存储
map
restHighLevelClient
thymeleaf
哈希
connectionFactory
爱国人士
back-pressure
Akka remoting
jquery
ISemaphore
破局思考
数据检索
AI
日常维护
书籍教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
Redis教程
Spring教程
Git教程
Jenkins进阶系列
openfire参考指南
Java设计模式
HBase教程
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
springcloud-demo
Hive教程
Ant教程
ANTLR教程
SpringCloud
java实例教程
XStream教程
Hazelcast教程
Elastic-Job-Lite
深入浅出MyBatis
SVN教程
ibaties教程
rabittmq教程
solr教程
Hadoop教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
java-demo
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
近期评论
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
【REACT NATIVE 系列教程之九】React Native版本升级步骤与备注
2
Google Android开发者文档系列之与其他应用程序交互(一)
3
InfoQ十周年
4
[iOS] Stellar:通过物理引擎 UIDynamic 实现超酷物理动画类库
5
独特低运营成本海量日志处理系统架构
6
动态Inventory功能详解
7
实现 WP 版微信的 Pivot Header 效果
8
大数据处理方面的 7 个开源搜索引擎
9
【时速云线上分享】第九期:镜像构建优化之路
10
Android 时间选择器
1
VPS 自我监控
2
springboot接入多个ES启动时候自检报错
3
配置虚拟站点
4
openfire协议支持指南
5
修改上传文件权限
6
OpenVZ VPS 额外支持
7
2015年北京下第一场雪留念
8
openfire定制指南
9
mysql存储过程实例一:游标的使用
10
Linux删除或者新增SWAP分区
1
如何将Spring Cloud Task发布Data Flow上执行?
2
Spring Cloud Data Flow快速入门Demo
3
Spring Cloud Consul实现选举机制
4
Spring Boot集成ShedLock实现分布式定时任务
5
利用oss进行数据库和网站图片备份
6
Spring Cloud Stream实现数据流处理
7
Python3访问MySQL数据库快速入门Demo
8
Github开源项目作者可以免费申请 JetBrains 全家桶
9
Spring Cloud Vault快速入门Demo
10
Spring Cloud Gateway快速入门Demo
网站信息
文章总数:82,716 篇
文件总数:284,297 个
标签总数:2,396 个
分类总数:85 个
留言数量:2,560 条
在线人数:626 人
运行天数:4,410天
最后更新:2024年11月23日15点
×
输入密码查看文章详情
×
搜索文章
搜索
热门搜索:
Java
Springboot
Linux
Maven
Bootstrap
阿里云
×
评论信息框
可以通过QQ号实时获取昵称和头像
QQ
昵称
邮箱
网址
提交评论
×
山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍
支付宝
微信
转账时请备注“
博客赞助
”
Loading...