我有以下情况。我的应用程序从配置文件中读取数据,在该文件中我定义了队列,其排他性,线程数和其他一些详细信息。启动应用程序时,它将从该配置中读取并为每个陈述的条目创建DirectMessageListenerContainer
。我将这些容器保存在地图中,在其中将每个容器与我给定的自定义名称相关联。
启动时,如果发生任何故障,应用程序将无法运行,这正是我想要的。
现在,关于这个问题。我创建了一个reload
方法,该方法允许用户更改配置而无需通过JMX重新启动应用程序。因此,当更改配置文件时,并且如果调用reload
方法,则将执行以下过程。检查新配置的有效性,如果正确,则用于设置新配置。为此,我首先停止所有容器,然后销毁它们。之后,我初始化新容器。而已。问题是,在停止,破坏或任何其他下一步发生异常时会发生什么。我处理了异常,但问题是它将使当前设置损坏或半生不熟。我想要一个回滚功能,但是我不确定该怎么做。因为在检查新配置的有效性之后,我将其设置为当前配置。
我可以保存当前设置,检查新设置是否有效,否则可以再次初始化前一个设置。但是,初始化上一个异常时,我可能会遇到另一个异常。
这是reload
函数。 RabbitManager
是我创建的类,没有什么特别的,只做stop
,destroy
等操作。
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();
}
}
我希望我的问题很清楚,如果需要任何东西,或者您认为当前的方法有问题,或者可能我遗漏了一点,请告诉我。抱歉,标题含糊。
答案 0 :(得分:1)
您为什么不stop()
只在新容器良好时销毁它们呢?如果新配置失败,则在销毁新容器后仅start()
个旧容器。