Apache Commons Pool - как использовать фабрику, которая принимает аргументы
Я пытаюсь использовать Apache Commons Pool для создания пула "объектов". Поскольку у меня уже есть фабрика объектов, которая принимает аргумент строкового типа и создает правильный тип объекта, я хочу использовать эту фабрику.
Но проблема в том, что ни одна из сигнатур универсального объекта пула не позволяет мне передать фабрику, которая принимает аргументы.
//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(), который принимает параметры.
Кажется, что единственный способ сделать это - написать несколько классов фабрики для каждого типа объекта и написать что-то еще, например:
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);
...
}
Или есть какой-нибудь элегантный способ вместо дублирования / создания нескольких фабричных классов только ради этого?
1 ответ
Вы должны прочитать на KeyedObjectPool<K,V>
интерфейс, который также можно найти в общем пуле.
Из своего 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: Похоже, вы не пометили ответы на свои вопросы как "принятые", возможно, вы захотите поработать над этим.