2016-07-08 2 views
0

меня такая ситуация:ModuleClassLoader одноточечно

  • Экземпляр JBOSS
  • применение client.war
  • применение server.war
  • модуль JBoss, установлен правильно, содержащий только интерфейсы.

Приложение server.war реализует интерфейсы модуля jboss и публикует эти реализации с помощью связывания JNDI. Приложение client.war с поиском использует реализации server.war.

Во время выполнения client.war может вызывать реализацию предоставляемый server.war, но как только я пытаюсь начать транзакции в спящий режим, я получаю следующее сообщение об ошибке:

ERROR [stderr] java.lang.IllegalStateException: JBAS016071: Singleton not set for ModuleClassLoader for Module "client.war:main" from Service Module Loader. This means that you are trying to access a weld deployment with a Thread Context ClassLoader that is not associated with the deployment.

Там я ударился головой в течение нескольких дней , но я не понимаю, в чем проблема. Кто-то может мне помочь?

ответ

0

Установите загрузчик классов на дочерний поток таким же, как и родительский.

Получить родительский класс погрузчик:

ClassLoader cl = Thread.currentThread().getContextClassLoader(); 

Установить дочерний класс погрузчик:

ClassLoader cl = Thread.currentThread().setContextClassLoader(cl); 

Когда ребенок нить сделана, убедитесь, чтобы сбросить загрузчик классов к нулю, чтобы избежать утечек в случае пулов потоков.

Хотя CDI будет работать в дочернем потоке, другие вещи, такие как удаленный вызов EJB, и запросы JNDI не будут.

Гораздо лучше Approch wuld быть использование EJB вызовов асинхронными Вы можете просто создать EJB, который выглядит примерно так:

@Singleton 
public class AsyncBean { 
@Asynchronous 
public void performTask(int a, int b) { 
// the client doesn't care what happens here 
} 

Это будет означать, что ваша асинхронная задача будет иметь TCCL установлено правильно, JNDI будет работа и т. д. (в основном это полный вызов EE).

Вы можете настроить пул потоков, используемый для async-invocations в файле standalone.xml, но он будет использоваться для всех методов @Asynchronous в приложении.

Первопричина

Когда приложение запускает свои собственные потоки, новые потоки используют загрузчик классы, который отличается от загрузчика классов из инициирующей нити, поэтому инъекции не удается.

Ссылка

https://access.redhat.com/solutions/257663

Смежные вопросы