проблема отключения impl сервислокатора в Джерси 2.22 - PullRequest
1 голос
/ 12 июня 2019

Контейнер приложения My Jersey закрывается с сообщением об исключении ниже.

java.lang.IllegalStateException: ServiceLocatorImpl(__HK2_Generated_0,0,1879131528) has been shut down
    at org.jvnet.hk2.internal.ServiceLocatorImpl.checkState(ServiceLocatorImpl.java:2288)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getServiceHandleImpl(ServiceLocatorImpl.java:629)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getServiceHandle(ServiceLocatorImpl.java:622)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getServiceHandle(ServiceLocatorImpl.java:640)
    at org.jvnet.hk2.internal.FactoryCreator.getFactoryHandle(FactoryCreator.java:103)
    ... 59 common frames omitted
Wrapped by: org.glassfish.hk2.api.MultiException: A MultiException has 1 exceptions.  They are:
1. java.lang.IllegalStateException: ServiceLocatorImpl(__HK2_Generated_0,0,1879131528) has been shut down

При появлении вышеуказанной ошибки приложение не может обработать запрос. Он многократно показывает одно и то же сообщение, а также мой весенний контейнер приложений также не работает. Ниже приведено сообщение об ошибке, которое я получаю многократно.

org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'daoQuery': Singleton bean creation not allowed while the singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)

java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext

Моя версия Glassfish Jersey - 2.22.2.

Вышеуказанное происходит только при большой нагрузке.

Мы проанализировали проблему и обнаружили, что эта проблема возникает в нескольких сценариях.

  1. Истекло время ожидания балансировщика нагрузки
  2. Джерси Hk2 конфликт

Мы исправили эти две точки, но все же мы получаем ту же ошибку при большой нагрузке.

Есть ли способ предотвратить или исправить проблему?

1 Ответ

1 голос
/ 12 июня 2019

Необходимо обновить до последней 2.28 последней версии или, по крайней мере, 2.26 версии, которая устраняет проблемы HK2

Еще одним большим изменением в коде Джерси является попытка сделать ядро ​​Джерси независимым от какой-либо конкретной инфраструктуры инъекций. Как вы могли бы сейчас заметить, Jersey 2.x (был!) Довольно сильно зависит от HK2, что иногда вызывает проблемы (особенно при работе с другими контейнерами для инъекций. Джерси теперь определяет свой собственный фасад для инъекций, который, при правильной реализации заменяет все внутренние инъекции Джерси.

Не ошибайтесь - Джерси все еще работает на hk2. Но должна быть возможность избавиться от этой зависимости, когда другой контейнер обеспечивает такую ​​же функциональность. Как уже упоминалось, мотивация состоит в том, чтобы иметь возможность беспрепятственно интегрироваться с другими средами, такими как cdi, guice и т. Д. Это все еще в стадии разработки, и есть одно следствие: пользователь должен обеспечить реализацию внедрения в Джерси. Единственный, который на 100% готов сейчас, основан на hk2:

   <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
...