Проблема интеграции 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 Service unavailable.

При отладке мы определили, что эта ошибка возникает через 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. 'service' создается как анонимный дочерний класс HttpServlet, поэтому instanceof должен быть истинным.

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
145
1

Ответы 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.

Другие вопросы по теме