blob: d6d3f4b755515c63c7e016b236908fd7644e4695 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "DefaultRedeliveryPolicy.h"
#include <decaf/lang/Math.h>
#include <decaf/util/Random.h>
using namespace activemq;
using namespace activemq::core;
using namespace activemq::core::policies;
using namespace decaf;
using namespace decaf::lang;
using namespace decaf::util;
////////////////////////////////////////////////////////////////////////////////
DefaultRedeliveryPolicy::DefaultRedeliveryPolicy() : backOffMultiplier(5.0),
collisionAvoidanceFactor(0.15),
initialRedeliveryDelay(1000LL),
maximumRedeliveries(6),
useCollisionAvoidance(false),
useExponentialBackOff(false),
redeliveryDelay(initialRedeliveryDelay),
maximumRedeliveryDelay(-1) {
}
////////////////////////////////////////////////////////////////////////////////
DefaultRedeliveryPolicy::~DefaultRedeliveryPolicy() {
}
////////////////////////////////////////////////////////////////////////////////
short DefaultRedeliveryPolicy::getCollisionAvoidancePercent() const {
return (short) Math::round(this->collisionAvoidanceFactor * 100);
}
////////////////////////////////////////////////////////////////////////////////
void DefaultRedeliveryPolicy::setCollisionAvoidancePercent(short value) {
this->collisionAvoidanceFactor = value * 0.01;
}
////////////////////////////////////////////////////////////////////////////////
long long DefaultRedeliveryPolicy::getNextRedeliveryDelay(long long previousDelay) {
static Random randomNumberGenerator;
long long nextDelay = redeliveryDelay;
if (previousDelay > 0 && useExponentialBackOff && (int) backOffMultiplier > 1) {
nextDelay = (long long) ((double) previousDelay * backOffMultiplier);
if (maximumRedeliveryDelay != -1 && nextDelay > maximumRedeliveryDelay) {
// in case the user 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
*/
double variance = (randomNumberGenerator.nextBoolean() ?
collisionAvoidanceFactor : -collisionAvoidanceFactor) * randomNumberGenerator.nextDouble();
nextDelay += (long long) ((double) nextDelay * variance);
}
return nextDelay;
}
////////////////////////////////////////////////////////////////////////////////
RedeliveryPolicy* DefaultRedeliveryPolicy::clone() const {
DefaultRedeliveryPolicy* copy = new DefaultRedeliveryPolicy;
copy->collisionAvoidanceFactor = this->collisionAvoidanceFactor;
copy->maximumRedeliveries = this->maximumRedeliveries;
copy->initialRedeliveryDelay = this->initialRedeliveryDelay;
copy->useCollisionAvoidance = this->useCollisionAvoidance;
copy->useExponentialBackOff = this->useExponentialBackOff;
copy->backOffMultiplier = this->backOffMultiplier;
copy->redeliveryDelay = this->redeliveryDelay;
copy->maximumRedeliveryDelay = this->maximumRedeliveryDelay;
return copy;
}