Пул apache commons — как использовать фабрику, которая принимает аргументы

Я пытаюсь использовать пул apache commons для создания пула «объектов». Поскольку у меня уже есть фабрика объектов, которая принимает аргумент строкового типа и создает правильный тип объекта, я хочу использовать эту фабрику.

Но проблема в том, что ни одна из подписей универсального объекта пула не позволяет мне передать фабрику, которая принимает аргументы.

//This is a wrapper class that holds an Object pool
Class INService {

    private ObjectPool<INConnection> pool_ = null;

    /**
     * Constructs an instance of INService, given a pool size 
     * and a class which implements INHandler interface.
     * @param poolSize - size of the service pool 
     * @param c - the class which handles the INHandler service interface.
     */
    public INService(int poolSize, String objectType) {

        pool_ = new GenericObjectPool<INConnection>(factory, Objecttype); // won't compile.
    }
    ...
}

Интерфейс PoolableObjectfactory определяет такие методы, как makeObject, destroyObject, validateObject, activObject и passivateObject. Но нет метода makeObject(), который принимает параметры.

Кажется, единственный способ сделать это — написать несколько фабричных классов для каждого типа объекта и написать что-то вроде if-else, например:

    public INService(int poolSize, String objectType) {

        if (objectType.equals("scap")
            pool_ = new GenericObjectPool<INConnection>(scapFactory);
        else if (objectType.equals("ucip")
            pool_ = new GenericObjectPool<INConnection>(ucipFactory);
        ...
    }

Или есть какой-нибудь элегантный способ вместо дублирования/создания нескольких фабричных классов только для этого?


person Mopparthy Ravindranath    schedule 14.11.2012    source источник


Ответы (1)


Вам следует прочитать KeyedObjectPool<K,V>, который также можно найти в commons-pool.

Из его javadoc:

A keyed pool pools instances of multiple types. Each type may be accessed using an arbitrary key.

Затем вы можете реализовать KeyedPoolableObjectFactory<K,V> для создания экземпляров на основе параметра key, у него есть makeObject(K key) искомую функцию.

PS: похоже, вы не отметили ответы на свои вопросы как «принятые», возможно, вы захотите поработать над этим.

person JBert    schedule 12.12.2012
comment
Как вы установили параметры для keyPool? например: .apache.org/proper/commons-pool/api-1.2/org/apache/ - person neoeahit; 13.09.2013
comment
@neoeahit Я не могу вспомнить, делал ли я это с помощью одного из конструкторов GenericKeyedObjectPoolFactory или через конструкторов для GenericKeyedObjectPool, вам придется попробовать. Или вы хотели узнать что-то еще? - person JBert; 14.09.2013