Перезагрузка / обновление конфигурационного файла Spring без перезапуска контейнера сервлета - PullRequest
37 голосов
/ 10 февраля 2009

Как я могу обновить конфигурационный файл Spring без перезапуска моего контейнера сервлета?

Я ищу решение, отличное от JRebel.

Ответы [ 4 ]

11 голосов
/ 22 января 2010

Что ж, может быть полезно выполнить такую ​​перезагрузку контекста при тестировании вашего приложения.

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

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class ReloadSpringContext {

    final static String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\"\n" +
        " \t\"http://www.springframework.org/dtd/spring-beans.dtd\">\n";

    final static String contextA =
        "<beans><bean id=\"test\" class=\"java.lang.String\">\n" +
            "\t\t<constructor-arg value=\"fromContextA\"/>\n" +
        "</bean></beans>";

    final static String contextB =
        "<beans><bean id=\"test\" class=\"java.lang.String\">\n" +
            "\t\t<constructor-arg value=\"fromContextB\"/>\n" +
        "</bean></beans>";

    public static void main(String[] args) throws IOException {
        //create a single context file
        final File contextFile = File.createTempFile("testSpringContext", ".xml");

        //write the first context into it
        FileUtils.writeStringToFile(contextFile, header + contextA);

        //create a spring context
        FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(
            new String[]{contextFile.getPath()}
        );

        //echo the bean 'test' on stdout
        System.out.println(context.getBean("test"));

        //write the second context into it
        FileUtils.writeStringToFile(contextFile, header + contextB);

        //refresh the context
        context.refresh();

        //echo the bean 'test' on stdout
        System.out.println(context.getBean("test"));
    }

}

И вы получите этот результат

fromContextA
fromContextB

Еще один способ добиться этого (и, возможно, более простой) - использовать функцию Refreshable Bean в Spring 2.5+ С помощью динамического языка (groovy и т. Д.) И весны вы даже можете изменить свое поведение компонента. Посмотрите на справочник по пружине для динамического языка :

24.3.1.2. Восстанавливаемые бобы

Один из (если не самый) самый неотразимая добавка стоимости динамического поддержка языков в Spring функция «обновляемый боб».

Обновляемый боб динамически поддерживаемый язык, который с небольшое количество конфигурации, бин с динамическим языком отслеживать изменения в своей основе ресурс исходного файла, а затем перезагрузите сам, когда динамический язык исходный файл изменен (например, когда разработчик редактирует и сохраняет изменения в файле на файловая система).

8 голосов
/ 28 ноября 2017

Для тех, кто спотыкается об этом в последнее время, современный и современный способ решения этой проблемы - использовать Cloud Boot Cloud Config .

Просто добавьте аннотацию @ RefreshScope к вашим обновляемым компонентам и @ EnableConfigServer к вашей основной / конфигурации.

Так, например, этот класс Controller:

@RefreshScope
@RestController
class MessageRestController {

    @Value("${message}")
    private String message;

    @RequestMapping("/message")
    String getMessage() {
        return this.message;
    }
}

Будет возвращать новое значение вашего свойства message String для конечной точки /message при каждом обновлении конфигурации.

См. Официальный пример Spring Guide for Centralized Configuration для получения дополнительной информации о реализации.

7 голосов
/ 11 февраля 2009

Я бы не рекомендовал вам это делать. Что вы ожидаете от одноэлементных бинов, которые изменили их конфигурацию? Вы ожидаете перезагрузки всех синглетов? но некоторые объекты могут содержать ссылки на эти синглтоны.

Смотрите также этот пост Автоматическая повторная инициализация конфигурации в Spring

2 голосов
/ 30 апреля 2012

Вы можете взглянуть на это http://www.wuenschenswert.net/wunschdenken/archives/138, где, как только вы измените какую-либо вещь в файле свойств и сохраните ее, бины будут перезагружены с новыми значениями.

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