1、其实在所有的客户端机器上,内存中都运行着一套客户端的ActiveMQ环境,该环境负责缓存发来的消息,负责维持着和ActiveMQ服务器的消息通讯,负责失效转移(fail-over)等,所有的判断和处理都是由这套客户端环境来完成的。 我们可以来对ActiveMQ的重发策略(Redelivery Policy)来进行自定义配置,其中的配置参数主要有以下几个: a) collisionAvoidanceFactor :碰撞躲避因数,默认值是0.15,这个参数是为了躲避高并发的重发带来的问题,我们查看org.apache.activemq.RedeliveryPolicy类的源代码, / +/-15%
2、 for a 30% spread -cgs protected double collisionAvoidanceFactor = 0.15d; protected long initialRedeliveryDelay = 1000L;可以发现,该默认值带来的变动范围是正负百分之15,也就是有30%的范围,也就是说,如果延迟发送时间(也就是initialRedeliveryDelay 默认值)是1000毫秒,则该条消息第一次有可能被拖延850毫秒到1150毫秒之间后被发送,如果有第二次重发,基数就不是1000毫秒了,而是以上一次重发拖延时间为基础来算。源代码如下: public long
3、getNextRedeliveryDelay(long previousDelay) long nextDelay = redeliveryDelay; if (previousDelay > 0 && useExponentialBackOff & backOffMultiplier & 1) nextDelay = (long) (previousDelay * backOffMultiplier); if(maximumRedeliveryDelay != -1 & nextDelay & maximumRedeliveryDelay) / in case the user
4、 made max redelivery delay less than redelivery delay for some reason. nextDelay = Math.max(maximumRedeliveryDelay, redeliveryDelay); if (useCollisionAvoidance) /* * First random determines +/-, second random determines how far to * Go in that direction. -cgs */ Random random = getRandomNumberGenera
5、tor(); double variance = (random.nextBoolean() ? collisionAvoidanceFactor : -collisionAvoidanceFactor) * random.nextDouble(); nextDelay += nextDelay * variance; return nextDelay; b)maximumRedeliveries :最大重发次数,默认值是6,如果你想不限次数重发,可以设置成-1。同样是org.apache.activemq.RedeliveryPolicy类中的代码: public static final
6、int NO_MAXIMUM_REDELIVERIES = -1; public static final int DEFAULT_MAXIMUM_REDELIVERIES = 6; protected int maximumRedeliveries = DEFAULT_MAXIMUM_REDELIVERIES;我们探究一下maximumRedeliveries 的get方法,可以发现有org.apache.activemq.ActiveMQSession和org.apache.activemq.ActiveMQMessageConsumer两个类中有用到: 其中ActiveMQSession
7、中的代码如下: / Figure out how long we should wait to resend this message. long redeliveryDelay = redeliveryPolicy.getInitialRedeliveryDelay(); for (int i = 0; i < redeliveryCounter; i+) / 每次重发拖延时间都是以上一次重发拖延时间来算,所以这里for循环来取得最新的拖延时间 redeliveryDelay = redeliveryPolicy.getNextRedeliveryDelay(redeliveryDel
8、ay); / 交给定时任务重发 connection.getScheduler().executeAfterDelay(new Runnable() public void run() (ActiveMQDispatcher)md.getConsumer().dispatch(md); , redeliveryDelay); ActiveMQMessageConsumer中的代码类似。 c)maximumRedeliveryDelay :重发最大拖延时间,默认为-1,表示没有最大拖延时间,此参数只有当useExponentialBackOff 为true时起效。同样是RedeliveryPol
9、icy中的代码: protected long maximumRedeliveryDelay = -1; 。看源代码就显而易见了。 d)initialRedeliveryDelay :第一次重发的拖延时间基础,默认是1000,单位为毫秒,前面讲collisionAvoidanceFactor 属性时已经提到过,这里不再多说。 e)redeliveryDelay :如果initialRedeliveryDelay 为0,则使用redeliveryDelay ,默认也是1000。RedeliveryPolicy中源代码如下: protected long redeliveryDelay = ini
10、tialRedeliveryDelay; f)useCollisionAvoidance :消息重发时是否采用前面提到的碰撞避免collisionAvoidanceFactor 参数,默认是false,不采用。源代码上面也给出了,这里不再多说。 g)useCollisionAvoidance :是否使用成倍增加拖延,默认为false,如果我们希望重发的拖延时间一次比一次大很多,则可以设置它为true。上面已经给出过源代码,这里再次给出: protected boolean useExponentialBackOff; protected double backOffMultiplier = 5
11、.0; * go in that direction. -cgs可以看出,成倍拖延是将上一次拖延时间乘以backOffMultiplier来实现的,而 backOffMultiplier默认为5. h)backOffMultiplier :成倍拖延时间的倍率,默认为5,上面已经提到了,这里不再多说。 那么接下来我们讨论下该如何配置上面所说的几项,我们可以通过Java代码,也就是JMS API来配置,也可以通过spring来配置,当然也可以通过连接器的URL来配置: 如果直接使用JMS API来使用ActiveMQ,我们可以如下配置(代码来自ActiveMQ的官方说明): ActiveMQCon
12、nection connection . / Create a connection RedeliveryPolicy queuePolicy = new RedeliveryPolicy(); queuePolicy.setInitialRedeliveryDelay(0); queuePolicy.setRedeliveryDelay(1000); queuePolicy.setUseExponentialBackOff(false); queuePolicy.setMaximumRedeliveries(2); RedeliveryPolicy topicPolicy = new Red
13、eliveryPolicy(); topicPolicy.setInitialRedeliveryDelay(0); topicPolicy.setRedeliveryDelay(1000); topicPolicy.setUseExponentialBackOff(false); topicPolicy.setMaximumRedeliveries(3); / Receive a message with the JMS API RedeliveryPolicyMap map = connection.getRedeliveryPolicyMap(); map.put(new ActiveM
14、QTopic(topic1), topicPolicy); map.put(new ActiveMQQueue(queue1), queuePolicy);注意,从ActiveMQ5.7开始,我们可以给每个目的地(Destination)配置不同的重发策略。ActiveMQConnection类中有一个成员变量 private RedeliveryPolicyMap redeliveryPolicyMap;,用来给不同的目的地配置不同的重发策略。至于如何在连接器的URL上配置,可以参考官方文档:http:/activemq.apache.org/connection-configuration-uri.html
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1