Я реализовал 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-компонента во время выполнения.
Большое спасибо!