在运行时禁用Spring bean

时间:2018-11-21 13:02:01

标签: spring spring-boot javabeans

我使用这样的示例(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的函数。

非常感谢!

0 个答案:

没有答案