保存已经 运行 个侦听器容器并在新设置失败时回滚

Saving already running listener containers and rolling back if new setting fails

我有以下情况。我的应用程序从一个配置文件中读取,我在其中定义了 queues、它的排他性、线程数和一些其他细节。当应用程序启动时,它会从该配置中读取并为每个声明的条目创建 DirectMessageListenerContainer。我将这些容器保存在一个地图中,我在其中将每个容器与我指定的自定义名称相关联。

启动时,如果发生任何故障,应用程序将无法 运行,这正是我想要的。 现在,关于这个问题。我创建了一个 reload 方法,它允许用户更改配置而无需通过 JMX 重新启动应用程序。所以,当配置文件发生变化时,如果调用了reload方法,就会执行下面的过程。检查新配置的有效性,如果正确,则用于设置新配置。为此,我首先停止所有容器,然后销毁它们。之后,我初始化新容器。就是这样。问题是,当停止、销毁或任何其他下一步发生异常时会发生什么。我处理了异常,但问题是它会破坏当前设置或 half-baked。我想有一个回滚功能,但我不确定该怎么做。因为在检查新配置的有效性后,我将其设置为当前配置。

我可以保存当前设置,检查新的设置是否有效,如果不正确,我可以再次初始化之前的设置。但是,我可以 运行 在初始化前一个异常时进入另一个异常。

这是 reload 函数。 RabbitManager是我创造的class,没有什么特别的,就是做stopdestroy

public String reloadConfiguration() {
    Rules newRules;

    // checking validity of new rules, setting it, handling exceptions...

    try {
        // setting new rules
        // rules variable saves the current rules 
        rules = newRules;

        // basically calls stop in all the containers
        rabbitManager.stopAll();
        // basically calls destroy in all the containers
        rabbitManager.destroyAllContainers();
        rabbitManager
                .init(rules) // initializes an empty map and sets rules as new rule.
                .registerListeners(); // reads rules and creates DirectMessageListenerContainer for each setting
        log.info("Configuration has been successfully changed, and stopped");
        // returns are for jConsole/monitoring
        return "Configuration has been successfully changed, and stopped";
    } catch (Exception ex) {
        log.error("Exception occurred - "+ex.getMessage(), ex);
        // returns are for jConsole/monitoring
        return "Exception : "+ex.getMessage();
    }
}

我希望我的问题很清楚,如果需要任何东西或者您认为当前的方法有问题,或者我可能遗漏了一些要点,请告诉我。抱歉,标题含糊不清。

为什么不只 stop() 容器,只有在新容器完好时才销毁它们。如果新配置失败,只需 start() 销毁新容器后的旧容器。