Проблема с интеграцией Tomcat Apache ServiceMix

Мы пытаемся интегрировать веб-приложение, работающее на Apache Tomcat 8.5.3, с Apache ServiceMix 7.0.1, используя мост Apache Felix (org.apache.felix.http.bridge-4.0.0.jar). Все перечисленные здесь шаги выполнены http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html

Но теперь мы получаем ошибку 503 Служба недоступна.

При отладке мы определили, что эта ошибка возникает через org.apache.felix.http.proxy.ProxyServlet (org.apache.felix.http.proxy-3.0.2.jar).

final HttpServlet dispatcher = this.tracker.getDispatcher();
if (dispatcher != null) {
    final HttpServletRequest r = (this.servletContext == null ? req : new BridgeHttpServletRequest(req, this.servletContext));
    dispatcher.service(r, res);
} else {
    res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
}

Теперь причина «диспетчер» равна нулю, потому что в трекере (org.apache.felix.http.proxy.DispatcherTracker) он не устанавливается.

@Override
public Object addingService(ServiceReference ref)
{
    Object service = super.addingService(ref);
    if (service instanceof HttpServlet) {
        setDispatcher((HttpServlet)service);
    }
    return service;
}

Таким образом (экземпляр службы HttpServlet) возвращается как false. Мы проследили происхождение «сервиса» и обнаружили, что он находится в классе org.apache.felix.http.bridge.jar — «сервис» org.apache.felix.http.bridge.internal.BridgeActivator создается как анонимный дочерний класс. из HttpServlet, поэтому instanceof должен был быть истинным.

Одно наблюдение - я заметил, что загрузчики классов для этих 2-х классов разные.

Загрузчик классов для «сервиса» — org.eclipse.osgi.internal.loader.EquinoxClassLoader (поскольку он загружается внутри пакета OSGI). Загрузчик классов для HttpServlet — java.net.URLClassLoader.

Может ли это быть причиной того, что instanceof возвращает значение false? Если да, то какое может быть решение для решения этой проблемы.

Любая помощь высоко ценится. Заранее спасибо.


person Praveen    schedule 19.07.2018    source источник


Ответы (1)


Проблема решена путем выполнения следующих шагов:

  1. Добавлен javax.servlet;javax.servlet.http;version=3.1.0 в системные пакеты OSGi (свойство org.osgi.framework.system.packages в config.properties)

  2. Добавлен javax.servlet-api-3.1.0.jar в папку lib\ext ServiceMix.

При добавлении к системным пакетам класс HttpServlet был экспортирован через System Bundle из загрузчика классов фреймворка, поэтому instanceof вернул true.

person Praveen    schedule 21.08.2018