Есть ли способ получить список всех контекстов приложений Spring, запущенных в JVM? - PullRequest
5 голосов
/ 16 февраля 2009

Я бы хотел получить список всех контекстов приложений Spring из веб-приложений, запущенных в моем контейнере сервлета. Это сделано для того, чтобы я мог заново инициализировать контексты без перезапуска или перезагрузки моего контейнера или веб-приложений.

Возможно ли это? Если так, то как? В любом случае можно получить список всех контекстов сервлета, запущенных на экземпляре контейнера сервлета через API сервлета?

Ответы [ 4 ]

3 голосов
/ 16 февраля 2009

Нет - на оба вопроса.

Доступ ко всем контекстам сервлетов был бы проблемой безопасности. Вы сможете просматривать и / или манипулировать другими веб-приложениями. Единственный, кто знает все контексты сервлета, это сам контейнер. Но это внутренняя реализация, нет API.

Доступ к контексту Spring аналогичен, но если вы имеете в виду все контексты Spring в одном веб-приложении, они создадут иерархию - например, для контроллеров. Реализация org.springframework.context.ApplicationListener в качестве bean-компонента в контексте корневой пружины (как инициализировано org.springframework.web.context.ContextLoaderListener, настроенным в web.xml) может уведомлять вас о запущенных, остановленных, закрытых или обновленных контекстах.

2 голосов
/ 16 февраля 2009

[Редактировать: это не очень помогает, так как каждый web.xml должен иметь одного и того же слушателя]

Вы могли бы ServletContextAttributeListener прослушивать вставки стандартного атрибута WebApplicationContext , а затем уведомлять некоторый централизованный монитор?

Не тестировалось:

public class SpringWACListener implements ServletContextAttributeListener {
    public void attributeAdded(ServletContextAttributeEvent scab) {
        if (WebApplicationContext.
            ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE.
            equals(scab.getName()) {
            myCentralisedMonitor.notify("added");
        }
    }
    // same for others
}
1 голос
/ 31 марта 2009

Вы можете попробовать Spring Application Management Suite

http://www.springsource.com/products/ams

не уверен, что это за затраты, не могу себе представить, что это дешево.

0 голосов
/ 16 февраля 2009

Раньше был, и он назывался [getServlets] (http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/ServletContext.html#getServlet(java.lang.String));, однако теперь он устарел без замены, означая, что такой метод, вероятно, сделал реализацию спецификации чрезмерно обременительной. Из JavaDoc спецификации :

getServlets

публичный java.util.Enumeration getServlets ()

Запрещены. Начиная с Java Servlet API 2.0, без замены.

Этот метод был изначально определен для возврата перечисления все сервлеты, известные этому сервлету контекст. В этой версии этот метод всегда возвращает пустое перечисление и остается только сохранить двоичный файл совместимость. Этот метод будет навсегда удален в будущем версия API сервлетов Java.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...