All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.async.rmi.pool.ShrinkableConnectionPool Maven / Gradle / Ivy

package org.async.rmi.pool;

import org.async.rmi.Connection;
import org.async.rmi.Factory;
import org.async.rmi.client.ClosedException;
import org.async.rmi.messages.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * Created by Barak Bar Orion
 * 27/10/14.
 */
public class ShrinkableConnectionPool implements Pool> {
    private static final Logger logger = LoggerFactory.getLogger(ShrinkableConnectionPool.class);

    private final List> free;
    private final List> all;
    private final int optimalSize;
    private Factory>> factory;
    private boolean closed = false;

    public ShrinkableConnectionPool(int optimalSize) {
        this.free = new ArrayList<>();
        this.all = new ArrayList<>();
        this.optimalSize = optimalSize;
    }
    public void setFactory(Factory>> factory) {
        this.factory = factory;
    }

    @Override
    public synchronized CompletableFuture> get() {
        if(closed){
            throw new ClosedException();
        }
        if (!free.isEmpty()) {
            return CompletableFuture.completedFuture(free.remove(0));
        } else {
            CompletableFuture> result = factory.create();
            result.thenAccept(all::add);
            return result;
        }
    }

    @Override
    public synchronized void free(Connection c) {
        if (c.isClosed()) {
            all.remove(c);
            free.remove(c);
        }else if (optimalSize < all.size()) {
            try {
                c.close();
                all.remove(c);
            } catch (IOException e) {
                logger.warn(e.toString(), e);
            }
        } else {
            free.add(c);
        }
    }

    int getAllSize() {
        return all.size();
    }

    int getFreeSize() {
        return free.size();
    }

    @Override
    public synchronized void close() throws IOException {
        if(closed){
            return;
        }
        for (Connection c : all) {
            try {
                c.close();
            } catch (IOException e) {
                logger.warn(e.toString(), e);
            }
        }
        all.clear();
        free.clear();
        closed = true;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy