我使用这样的示例(https://www.baeldung.com/java-management-extensions).
实现了一个MBean。我希望能够在运行时通过JConsole禁用/销毁另一个bean(例如 MyAnotherBean )。
下面是MBean中处理destroy函数的方法。 我能够在JConsole UI中正确调用此方法,但似乎bean仍处于活动状态。 请让我处理该情况。
案例1
我使用 MyAnotherBean类实现DisposableBean 。 我在该类中实现了 destroy()方法。
public void destroy() {
System.out.println("Perform destructive work or release resources.");
}
案例2-步骤1
我使用 SingletonBeanRegistry 在创建该 MyAnotherBean bean时进行注册。
public MyAnotherBean listener() {
MyAnotherBean myAnotherBean= new MyAnotherBean ();
AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
SingletonBeanRegistry beanDefinitionRegistry = (SingletonBeanRegistry) beanFactory;
beanDefinitionRegistry.registerSingleton("MyAnotherBean", MyAnotherBean);
return myAnotherBean;
}
案例2-步骤2 在MBean类中,我尝试了两种销毁该bean的方法。
我尝试的第一种方法是:
MyAnotherBean testBean = (MyAnotherBean)context.getBean("MyAnotherBean");
((DefaultListableBeanFactory)(context.getAutowireCapableBeanFactory())).destroyBean(testBean);
但是在此代码行之后仍可以检索到相同的bean实例。 我尝试的第二种方法是
AutowireCapableBeanFactory beanFactory = context.getAutowireCapableBeanFactory();
beanFactory.destroyBean(testBean);
我可以看到 destroy()方法被调用,因为 println()消息已打印到控制台。
但是再次在此代码行之后仍可以检索到相同的bean实例。
我还尝试了另外两种方法,需要将bean的名称作为字符串传递。
我确保字符串 MyAnotherBean 与最初注册该bean时的字符串相同。
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 /我应该在运行时销毁bean的函数。
非常感谢!