ActiveMQ的消息重发机制Word格式文档下载.docx
《ActiveMQ的消息重发机制Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ActiveMQ的消息重发机制Word格式文档下载.docx(6页珍藏版)》请在冰豆网上搜索。
其实在所有的客户端机器上,内存中都运行着一套客户端的ActiveMQ环境,该环境负责缓存发来的消息,负责维持着和ActiveMQ服务器的消息通讯,负责失效转移(fail-over)等,所有的判断和处理都是由这套客户端环境来完成的。
我们可以来对ActiveMQ的重发策略(RedeliveryPolicy)来进行自定义配置,其中的配置参数主要有以下几个:
a)collisionAvoidanceFactor:
碰撞躲避因数,默认值是0.15,这个参数是为了躲避高并发的重发带来的问题,我们查看org.apache.activemq.RedeliveryPolicy类的源代码,
//+/-15%fora30%spread-cgs
protecteddoublecollisionAvoidanceFactor=0.15d;
protectedlonginitialRedeliveryDelay=1000L;
可以发现,该默认值带来的变动范围是正负百分之15,也就是有30%的范围,也就是说,如果延迟发送时间(也就是initialRedeliveryDelay默认值)是1000毫秒,则该条消息第一次有可能被拖延850毫秒到1150毫秒之间后被发送,如果有第二次重发,基数就不是1000毫秒了,而是以上一次重发拖延时间为基础来算。
源代码如下:
publiclonggetNextRedeliveryDelay(longpreviousDelay){
longnextDelay=redeliveryDelay;
if(previousDelay&
gt;
0&
amp;
&
useExponentialBackOff&
backOffMultiplier&
1){
nextDelay=(long)(previousDelay*backOffMultiplier);
if(maximumRedeliveryDelay!
=-1&
nextDelay&
maximumRedeliveryDelay){
//incasetheusermademaxredeliverydelaylessthanredeliverydelayforsomereason.
nextDelay=Math.max(maximumRedeliveryDelay,redeliveryDelay);
}
if(useCollisionAvoidance){
/*
*Firstrandomdetermines+/-,secondrandomdetermineshowfarto
*Gointhatdirection.-cgs
*/
Randomrandom=getRandomNumberGenerator();
doublevariance=(random.nextBoolean()?
collisionAvoidanceFactor:
-collisionAvoidanceFactor)*random.nextDouble();
nextDelay+=nextDelay*variance;
returnnextDelay;
b)maximumRedeliveries:
最大重发次数,默认值是6,如果你想不限次数重发,可以设置成-1。
同样是org.apache.activemq.RedeliveryPolicy类中的代码:
publicstaticfinalintNO_MAXIMUM_REDELIVERIES=-1;
publicstaticfinalintDEFAULT_MAXIMUM_REDELIVERIES=6;
protectedintmaximumRedeliveries=DEFAULT_MAXIMUM_REDELIVERIES;
我们探究一下maximumRedeliveries的get方法,可以发现有org.apache.activemq.ActiveMQSession和org.apache.activemq.ActiveMQMessageConsumer两个类中有用到:
其中ActiveMQSession中的代码如下:
//Figureouthowlongweshouldwaittoresendthismessage.
longredeliveryDelay=redeliveryPolicy.getInitialRedeliveryDelay();
for(inti=0;
i&
lt;
redeliveryCounter;
i++){
//每次重发拖延时间都是以上一次重发拖延时间来算,所以这里for循环来取得最新的拖延时间
redeliveryDelay=redeliveryPolicy.getNextRedeliveryDelay(redeliveryDelay);
//交给定时任务重发
connection.getScheduler().executeAfterDelay(newRunnable(){
publicvoidrun(){
((ActiveMQDispatcher)md.getConsumer()).dispatch(md);
},redeliveryDelay);
ActiveMQMessageConsumer中的代码类似。
c)maximumRedeliveryDelay:
重发最大拖延时间,默认为-1,表示没有最大拖延时间,此参数只有当useExponentialBackOff为true时起效。
同样是RedeliveryPolicy中的代码:
protectedlongmaximumRedeliveryDelay=-1;
。
。
看源代码就显而易见了。
d)initialRedeliveryDelay:
第一次重发的拖延时间基础,默认是1000,单位为毫秒,前面讲collisionAvoidanceFactor属性时已经提到过,这里不再多说。
e)redeliveryDelay:
如果initialRedeliveryDelay为0,则使用redeliveryDelay,默认也是1000。
RedeliveryPolicy中源代码如下:
protectedlongredeliveryDelay=initialRedeliveryDelay;
f)useCollisionAvoidance:
消息重发时是否采用前面提到的碰撞避免collisionAvoidanceFactor参数,默认是false,不采用。
源代码上面也给出了,这里不再多说。
g)useCollisionAvoidance:
是否使用成倍增加拖延,默认为false,如果我们希望重发的拖延时间一次比一次大很多,则可以设置它为true。
上面已经给出过源代码,这里再次给出:
protectedbooleanuseExponentialBackOff;
protecteddoublebackOffMultiplier=5.0;
*gointhatdirection.-cgs
可以看出,成倍拖延是将上一次拖延时间乘以backOffMultiplier来实现的,而backOffMultiplier默认为5.
h)backOffMultiplier:
成倍拖延时间的倍率,默认为5,上面已经提到了,这里不再多说。
那么接下来我们讨论下该如何配置上面所说的几项,我们可以通过Java代码,也就是JMSAPI来配置,也可以通过spring来配置,当然也可以通过连接器的URL来配置:
如果直接使用JMSAPI来使用ActiveMQ,我们可以如下配置(代码来自ActiveMQ的官方说明):
ActiveMQConnectionconnection...//Createaconnection
RedeliveryPolicyqueuePolicy=newRedeliveryPolicy();
queuePolicy.setInitialRedeliveryDelay(0);
queuePolicy.setRedeliveryDelay(1000);
queuePolicy.setUseExponentialBackOff(false);
queuePolicy.setMaximumRedeliveries
(2);
RedeliveryPolicytopicPolicy=newRedeliveryPolicy();
topicPolicy.setInitialRedeliveryDelay(0);
topicPolicy.setRedeliveryDelay(1000);
topicPolicy.setUseExponentialBackOff(false);
topicPolicy.setMaximumRedeliveries(3);
//ReceiveamessagewiththeJMSAPI
RedeliveryPolicyMapmap=connection.getRedeliveryPolicyMap();
map.put(newActiveMQTopic("
topic1"
),topicPolicy);
map.put(newActiveMQQueue("
queue1"
),queuePolicy);
注意,从ActiveMQ5.7开始,我们可以给每个目的地(Destination)配置不同的重发策略。
ActiveMQConnection类中有一个成员变量privateRedeliveryPolicyMapredeliveryPolicyMap;
,用来给不同的目的地配置不同的重发策略。
至于如何在连接器的URL上配置,可以参考官方文档:
http:
//activemq.apache.org/connection-configuration-uri.html