ActiveMQ的消息重发机制Word格式文档下载.docx

上传人:b****6 文档编号:20250651 上传时间:2023-01-21 格式:DOCX 页数:6 大小:17.67KB
下载 相关 举报
ActiveMQ的消息重发机制Word格式文档下载.docx_第1页
第1页 / 共6页
ActiveMQ的消息重发机制Word格式文档下载.docx_第2页
第2页 / 共6页
ActiveMQ的消息重发机制Word格式文档下载.docx_第3页
第3页 / 共6页
ActiveMQ的消息重发机制Word格式文档下载.docx_第4页
第4页 / 共6页
ActiveMQ的消息重发机制Word格式文档下载.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

ActiveMQ的消息重发机制Word格式文档下载.docx

《ActiveMQ的消息重发机制Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ActiveMQ的消息重发机制Word格式文档下载.docx(6页珍藏版)》请在冰豆网上搜索。

ActiveMQ的消息重发机制Word格式文档下载.docx

其实在所有的客户端机器上,内存中都运行着一套客户端的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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 图表模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1