Изолировать реализацию jndi-ресурса от интерфейса с помощью загрузчиков классов - PullRequest
0 голосов
/ 18 января 2019

У меня есть приложение myapp.war , которое получает JMS-соединение в соответствии с JNDI-ресурсом от tomcat.Jms-реализация - activemq-клиент .Но activemq-client требует slf4j .Я помещаю activemq-client, slf4j и другие библиотеки зависимостей в ${TOMCAT_HOME}/lib/ext.

Но myapp.war несовместимо с этой версией slf4j.А activemq-клиент - это несовместимость с версией slf4j внутри myapp.war .

Я думаю:

  • put basic jms-intrefaces jars в ${TOMCAT_HOME}/lib/ext
  • положить activeqm-client и его зависимости в another/directiory
  • сделать собственную JNDI-фабрику для создания экземпляра jms-реализации
  • изолировать создание экземпляра jms-реализации внутри new Classloader с classpath another/directiory в этой JNDI-фабрике
  • вернуть результат в myapp.war

Т.е. эта иерархия загрузчика классов выглядит следующим образом:

         Bootstrap
             |
          System
             |                
    ---------------------         
   |      Common         |
   |                     |    pass connection parameters     --------------------------------------
   |  my-jndi-factory <--|--------------------------------->| Isolated class loader with classpath |
    ---------------------     return ConnectionFactory      | `another/directiory`                 |
         /      \                                            --------------------------------------
        /        \                
    myapp.war  otherApp.war 

Мои вопросы:

  • Есть ли библиотеки с такой функциональностью?
  • какие недостатки и подводные камни имеют этот подход?
...