package org.ow2.choreos.ee.nodes.cloudprovider;
import java.util.Random;
import org.apache.log4j.Logger;
/**
*
* Provides an exclusive token to concurrent clients.
*
* The token is used to ensure only a client at time is enable to perform some
* action. Used to enforce AWS EC2 rule: clients should not make more than one
* request per second.
*
* @author leonardo
*
*/
public class DelayedRequestEnforcer {
private final static Logger logger = Logger.getLogger(DelayedRequestEnforcer.class);
private final long minTimeBetweenRequestsInMillis;
private boolean token = true;
private Random random = new Random();
public DelayedRequestEnforcer(long minTimeBetweenRequestsInMillis) {
this.minTimeBetweenRequestsInMillis = minTimeBetweenRequestsInMillis;
}
public void enforceRule() {
while (!getToken()) {
waitDelta();
}
waitMinTimeBetweenRequests();
releaseToken();
}
private void waitDelta() {
final int DELAY = 10;
final int DELTA = random.nextInt(10);
try {
Thread.sleep(DELAY + DELTA);
} catch (InterruptedException e) {
logger.error("Exception at sleeping =/");
}
}
private boolean getToken() {
boolean ok = false;
synchronized (this) {
ok = token;
if (ok) {
token = false;
}
}
return ok;
}
private void waitMinTimeBetweenRequests() {
try {
Thread.sleep(minTimeBetweenRequestsInMillis);
} catch (InterruptedException e) {
logger.error("Exception at sleeping =/");
}
}
private void releaseToken() {
token = true;
}
}