Отключить бин Spring во время выполнения - PullRequest
0 голосов
/ 21 ноября 2018

Я реализовал MBean, используя примеры, подобные этому (https://www.baeldung.com/java-management-extensions).

Я хочу иметь возможность отключить / уничтожить другой компонент (например, MyAnotherBean ) во время выполнения через JConsole.

Ниже приведен метод из MBean, который обрабатывает функцию уничтожения. Я могу правильно вызвать этот метод в пользовательском интерфейсе JConsole, но кажется, что компонент все еще активен. Пожалуйста, дайте мне знать, как мне следует обработать этот случай.

Случай 1

Я использую Класс MyAnotherBean реализует DisposableBean . В этом классе я реализовал метод destroy () .

public void destroy() {
    System.out.println("Perform destructive work or release resources.");
} 

Случай 2 - Шаг 1

Я использовал SingletonBeanRegistry , чтобы зарегистрировать этот боб MyAnotherBean при его создании.

public MyAnotherBean listener() {
        MyAnotherBean myAnotherBean= new MyAnotherBean ();
        AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
        SingletonBeanRegistry beanDefinitionRegistry = (SingletonBeanRegistry) beanFactory;
        beanDefinitionRegistry.registerSingleton("MyAnotherBean", MyAnotherBean);

        return myAnotherBean;
      }

Случай 2 - Шаг 2 В классе MBean я попробовал два способа уничтожить этот компонент.

Первый способ, которым я попытался, был:

MyAnotherBean testBean = (MyAnotherBean)context.getBean("MyAnotherBean");
((DefaultListableBeanFactory)(context.getAutowireCapableBeanFactory())).destroyBean(testBean);

Но этот же экземпляр компонента все еще можно получить после этой строки кода.Я только что попробовал:

AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
beanFactory.destroyBean(testBean);

Я вижу, что метод destroy () был вызван, так как на консоль было выведено сообщение println () .

Но, опять же, тот же экземпляр компонента все еще может быть получен после этой строки кода.

Я также попробовал два других метода, где мне нужно было передать имя компонента в виде строки.

Я убедился, что строка MyAnotherBean соответствует той же строке, когда этот компонент был первоначально зарегистрирован.

AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
      ((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("MyAnotherBean ");

или

AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
      ((DefaultListableBeanFactory) beanFactory).destroySingleton("MyAnotherBean");

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

проблема с вызовом MyAnotherBean: java.rmi.UnmarshalException: Ошибка возврата немаршалинга: вложенное исключение: java.lang.ClassNotFoundException: org.springframework.beans.factory.NoSuchBeanDefinitionException (без менеджера безопасности: загрузчик класса RMI отключен)

Пожалуйста, дайте мне знатьправильные шаги / beanFactory / function Я должен использовать для уничтожения bean-компонента во время выполнения.

Большое спасибо!

...