/* * Copyright 2009 VoidSearch.com * * Licensed 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. */ package com.voidsearch.voidbase.core; import com.voidsearch.voidbase.module.VoidBaseModule; import com.voidsearch.voidbase.module.VoidBaseModuleRequest; import com.voidsearch.voidbase.config.VoidBaseConfiguration; import com.voidsearch.voidbase.config.Config; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * preserving per-handler connection counts * and queue of pending requests * operates as thread that iterates on expired requests on queue * and executes soft/hard cap handlers * * @author Aleksandar Bradic */ public class VoidBaseRequestQueue implements Runnable { private ConcurrentHashMap<VoidBaseModule, Integer> counts = new ConcurrentHashMap<VoidBaseModule, Integer>(); private ConcurrentHashMap<VoidBaseModule, LinkedBlockingQueue<VoidBaseModuleRequest>> queue = new ConcurrentHashMap<VoidBaseModule, LinkedBlockingQueue<VoidBaseModuleRequest>>(); int DEFAULT_CAP = Integer.parseInt(VoidBaseConfiguration.get(Config.GLOBAL, Config.REQUEST_QUEUE, Config.MAX_REQUESTS)); private static final VoidBaseRequestQueue INSTANCE = new VoidBaseRequestQueue(); private VoidBaseRequestQueue() { } public static VoidBaseRequestQueue getInstance() { return INSTANCE; } public boolean slotAvailable(VoidBaseModule module, VoidBaseModuleRequest request) { if (!counts.containsKey(module)) { counts.put(module,1); } int cap = DEFAULT_CAP; if (counts.get(module) < cap) { counts.put(module, counts.get(module) +1); return true; } else { return false; } } public void releaseSlot(VoidBaseModule module, VoidBaseModuleRequest request) { if (counts.contains(module)) { counts.put(module,counts.get(module)-1); } } public void enqueue(VoidBaseModule module, VoidBaseModuleRequest request) { if (!queue.containsKey(module)) { queue.put(module, new LinkedBlockingQueue<VoidBaseModuleRequest>()); } LinkedBlockingQueue<VoidBaseModuleRequest> moduleQueue = queue.get(module); moduleQueue.add(request); } public void run() { // iterates the queue and based on timestamp invokes cap handlers } }