package org.distributeme.core.concurrencycontrol;
import net.anotheria.util.StringUtils;
import org.distributeme.core.ClientSideCallContext;
import org.distributeme.core.ServerSideCallContext;
import java.util.concurrent.atomic.AtomicLong;
/**
* This implementation of a concurrencycontrolstrategy is based on constants which are annotated to the target interface.
*
* @author lrosenberg
* @version $Id: $Id
*/
public class ConstantBasedConcurrencyControlStrategy implements ConcurrencyControlStrategy{
/**
* Max number of connections on client side.
*/
private int clientSideLimit = Integer.MAX_VALUE;
/**
* Max number of connections on server side.
*/
private int serverSideLimit = Integer.MAX_VALUE;
/**
* Currenty active client side requests.
*/
private AtomicLong clientSideRequestCount = new AtomicLong(0);
/**
* Currently active server side requests.
*/
private AtomicLong serverSideRequestCount = new AtomicLong(0);
/** {@inheritDoc} */
@Override
public void customize(String parameter) {
if (parameter==null || parameter.length()==0)
throw new IllegalArgumentException("Empty or null parameter, expected clientlimit,serverlimit");
String limits[] = StringUtils.tokenize(parameter, ',');
int aClientSideLimit = Integer.parseInt(limits[0]);
if (aClientSideLimit>0)
clientSideLimit = aClientSideLimit;
int aServerSideLimit = 0;
if (limits.length>1)
aServerSideLimit = Integer.parseInt(limits[1]);
if (aServerSideLimit>0)
serverSideLimit = aServerSideLimit;
}
/** {@inheritDoc} */
@Override
public void notifyClientSideCallStarted(ClientSideCallContext context) {
if (clientSideRequestCount.incrementAndGet()>clientSideLimit){
clientSideRequestCount.decrementAndGet();
throw new OutgoingRequestRefusedException();
}
}
/** {@inheritDoc} */
@Override
public void notifyClientSideCallFinished(ClientSideCallContext context) {
clientSideRequestCount.decrementAndGet();
}
/** {@inheritDoc} */
@Override
public void notifyServerSideCallStarted(ServerSideCallContext context) {
if (serverSideRequestCount.incrementAndGet()>serverSideLimit){
serverSideRequestCount.decrementAndGet();
throw new ServerRefusedRequestException();
}
}
/** {@inheritDoc} */
@Override
public void notifyServerSideCallFinished(ServerSideCallContext context) {
serverSideRequestCount.decrementAndGet();
}
/** {@inheritDoc} */
@Override public String toString(){
return getClass().getSimpleName()+" with limits ("+clientSideLimit+", "+serverSideLimit+")";
}
}