Мы пытаемся интегрировать веб-приложение, работающее на 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? Если да, то какое может быть решение для решения этой проблемы.
Любая помощь высоко ценится. Заранее спасибо.