Задать вопрос
@Kamaed
Студентота

Как правильно применять Eviction Policy в org.apache.commons.pool2?

package com.mycompany.simplepool;

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.EvictionConfig;
import org.apache.commons.pool2.impl.EvictionPolicy;

public class MyEvictionPolicy<T> implements EvictionPolicy<T> {
    
    @Override
    public boolean evict(EvictionConfig config, PooledObject<T> underTest, int idleCount) {
        System.out.println("MyEvictPolicy");
        if (Integer.parseInt(underTest.getObject().toString()) % 2 == 0) {
            System.out.println("Delete because % 2 == 0 ---- " + underTest.getObject());
            return true;
        }
        if ((config.getIdleSoftEvictTime() < underTest.getIdleTimeMillis() &&
                config.getMinIdle() < idleCount) ||
                config.getIdleEvictTime() < underTest.getIdleTimeMillis()) {
            return true;
        }
        return false;
    }
}

Имплементировал EvictionPolicy для String'а. Хочу чтобы удалялись строки содержащие четные числа.
Создаю пул:
BasePooledObjectFactory<String> poolFactory = new MyBasePooledObjectFactory();
GenericObjectPoolConfig configPool = new GenericObjectPoolConfig();
configPool.setTimeBetweenEvictionRunsMillis(10);
configPool.setMaxIdle(2);
GenericObjectPool<String> pool = new GenericObjectPool<>(poolFactory);
pool.setEvictionPolicyClassName(MyEvictionPolicy.class.getName()); // - задаю Eviction Policy
pool.setConfig(configPool);

Однако пул не вызывает мою реализацию MyEvictionPolicy.evict, когда проверяет объекты для удаления. Моя реализация вызывается только при явном вызове метода pool.evict().
Как сделать так, чтобы пул использовал именно мой MyEvictionPolicy.evict при периодических проверках?
  • Вопрос задан
  • 381 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@Kamaed Автор вопроса
Студентота
Ковыряясь в исходниках, пришел к выводу, что можно указать EvictionPolicy в конфиге и передать его в перегруженный конструктор.
BasePooledObjectFactory<String> poolFactory = new MyBasePooledObjectFactory();
GenericObjectPoolConfig configPool = new GenericObjectPoolConfig();
configPool.setTimeBetweenEvictionRunsMillis(100);
configPool.setMaxIdle(2);
configPool.setEvictionPolicyClassName(MyEvictionPolicy.class.getName());
GenericObjectPool<String> pool = new GenericObjectPool<>(poolFactory, configPool);

Тогда GenericObjectPool.evictionPolicy проставляется раньше запуска TimerTask с проверками.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы