Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * Copyright 2007, Red Hat Middleware LLC, and individual contributors
   * as indicated by the @author tags. See the copyright.txt file in the
   * distribution for a full listing of individual contributors.
   *
   * This is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as
   * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
 package org.jboss.as.ejb3.pool.strictmax;
 
 import static org.jboss.as.ejb3.EjbLogger.ROOT_LOGGER;
 import static org.jboss.as.ejb3.EjbMessages.MESSAGES;
 
 
A pool with a maximum size.

Author(s):
Carlo de Wolf
Kabir Khan
 
 public class StrictMaxPool<T> extends AbstractPool<T> {

    
A FIFO semaphore that is set when the strict max size behavior is in effect. When set, only maxSize instances may be active and any attempt to get an instance will block until an instance is freed.
 
     private final Semaphore semaphore;
    
The maximum number of instances allowed in the pool
 
     private final int maxSize;
    
The time to wait for the semaphore.
 
     private final long timeout;
     private final TimeUnit timeUnit;
    
The pool data structure Guarded by the implicit lock for "pool"
 
     private final LinkedList<T> pool = new LinkedList<T>();
 
     public StrictMaxPool(StatelessObjectFactory<T> factoryint maxSizelong timeoutTimeUnit timeUnit) {
         super(factory);
         this. = maxSize;
         this. = new Semaphore(maxSizetrue);
         this. = timeout;
         this. = timeUnit;
     }
 
     public void discard(T ctx) {
         if (.isTraceEnabled()) {
             .tracef("Discard instance %s#%s"thisctx);
         }
 
         // If we block when maxSize instances are in use, invoke release on strictMaxSize
         .release();
 
         // Let the super do any other remove stuff
         super.doRemove(ctx);
     }
 
     public int getCurrentSize() {
         return getCreateCount() - getRemoveCount();
     }
 
     public int getAvailableCount() {
         return .availablePermits();
     }
 
     public int getMaxSize() {
         return ;
     }
 
     public void setMaxSize(int maxSize) {
         throw .methodNotImplemented();
     }

    
Get an instance without identity. Can be used by finders,create-methods, and activation

Returns:
Context /w instance
    public T get() {
        try {
            boolean acquired = .tryAcquire();
            if (!acquired)
                throw .failedToAcquirePermit();
        } catch (InterruptedException e) {
            throw .acquireSemaphoreInterrupted();
        }
        synchronized () {
            if (!.isEmpty()) {
                return .removeFirst();
            }
        }
        T bean = null;
        try {
            // Pool is empty, create an instance
            bean = create();
        } finally {
            if (bean == null) {
                .release();
            }
        }
        return bean;
    }

    
Return an instance after invocation.

Called in 2 cases: a) Done with finder method b) Just removed

Parameters:
obj
    public void release(T obj) {
        if (.isTraceEnabled()) {
            .tracef("%s/%s Free instance: %s".size(), this);
        }
        boolean destroyIt = false;
        synchronized () {
            // Add the unused context back into the pool
            if (.size() < )
                .add(obj);
            else
                destroyIt = true;
        }
        if (destroyIt)
            destroy(obj);
        // If we block when maxSize instances are in use, invoke release on strictMaxSize
        .release();
    }
    @Override
    @Deprecated
    public void remove(T ctx) {
        if (.isTraceEnabled()) {
            .tracef("Removing instance: %s#%s"thisctx);
        }
        .release();
        // let the super do the other remove stuff
        super.doRemove(ctx);
    }
    public void start() {
        // TODO Auto-generated method stub
    }
    public void stop() {
        synchronized () {
            for (T obj : ) {
                destroy(obj);
            }
            .clear();
        }
    }
New to GrepCode? Check out our FAQ X