Невозможно создать экземпляр EvictionPolicy типа org.apache.commons.pool2.impl.DefaultEvictionPolicy. - PullRequest
0 голосов
/ 09 марта 2019

Я получаю сообщение об ошибке ниже в одной части моего приложения, где оно пытается сохранить / создать / обновить данные в базе данных.Приложение работает нормально в течение некоторого времени, скажем, через 1-2 часа после развертывания, но через некоторое время начинает выдавать эту ошибку при вызовах обновления.Я использую реализацию JPA EclipseLink.

Примечание. Вызов обновления выполняется асинхронно с использованием завершаемого будущего.Вызов выглядит примерно так:

CompletableFuture.supplyAsync(() -> {
            if (someBean != null) {
                try {
                    someReturnVal = methodCall();
                } catch (Exception e) {
                    log.info("Log with reason: "
                            + e.getMessage());
                }

            }
            return someReturnVal;
        }).thenAccept(someReturnVal -> {
            try {
                SomeBean.saveToDB(someReturnVal);
            } catch (AccessException e) {
                log.info("log with reason: " + e.getMessage());
            }
        });

SaveToDB выглядит так:

@Transactional
    public void SaveToDB(SomeBean arg1) {

        try {
            em.persist(arg1);
            em.flush();
        }Catch{
....
} 

Сообщение об ошибке в трассировке стека :

     java.lang.IllegalArgumentException: Unable to create EvictionPolicy instance of type org.apache.commons.pool2.impl.DefaultEvictionPolicy
        at org.apache.commons.pool2.impl.BaseGenericObjectPool.setEvictionPolicyClassName(BaseGenericObjectPool.java:607)
        at org.apache.commons.pool2.impl.GenericKeyedObjectPool.setConfig(GenericKeyedObjectPool.java:257)
        at org.apache.commons.pool2.impl.GenericKeyedObjectPool.<init>(GenericKeyedObjectPool.java:111)
        at com.**.cloud.runtime.kotyo.persistence.client.pool.GenericKeyedObjectPoolAdapter.<init>(GenericKeyedObjectPoolAdapter.java:25)
        at com.**.cloud.runtime.kotyo.persistence.client.pool.managed.PoolableManagedConnectionFactoryAdapter.makeObject(PoolableManagedConnectionFactoryAdapter.java:86)
        at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)...
...
Caused by: java.lang.ClassNotFoundException: org/apache/commons/pool2/impl/DefaultEvictionPolicy
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forNameFW(Class.java:362)
    at java.lang.Class.forName(Class.java:355)
    at org.apache.commons.pool2.impl.BaseGenericObjectPool.setEvictionPolicyClassName(BaseGenericObjectPool.java:598)
    ... 77 common frames omitted

Я не знаю, что здесь происходит не так.Может кто-нибудь, пожалуйста, помогите мне здесь.

1 Ответ

0 голосов
/ 12 марта 2019

Я смог решить эту проблему, создав свой собственный ThreadPoolExecutor с использованием Исполнителей , как показано ниже:

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();

Затем я передал этого исполнителя моему CompletableFutureзвоните:

CompletableFuture.supplyAsync(() -> { ....
            return someReturnVal;
        }, executor).thenAccept(someReturnVal -> {
            ....
        });

это решило мою проблему.Проблема возникает, когда новое CompletableFuture асинхронно завершается с помощью задачи, выполняемой в ForkJoinPool.commonPool ().

...