保存已运行的侦听器容器,如果新设置失败则回滚

时间:2019-06-12 12:03:50

标签: java spring-boot rabbitmq spring-amqp

我有以下情况。我的应用程序从配置文件中读取数据,在该文件中我定义了队列,其排他性,线程数和其他一些详细信息。启动应用程序时,它将从该配置中读取并为每个陈述的条目创建DirectMessageListenerContainer。我将这些容器保存在地图中,在其中将每个容器与我给定的自定义名称相关联。

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

我可以保存当前设置,检查新设置是否有效,否则可以再次初始化前一个设置。但是,初始化上一个异常时,我可能会遇到另一个异常。

这是reload函数。 RabbitManager是我创建的类,没有什么特别的,只做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();
    }
}

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

1 个答案:

答案 0 :(得分:1)

您为什么不stop()只在新容器良好时销毁它们呢?如果新配置失败,则在销毁新容器后仅start()个旧容器。