保存已经 运行 个侦听器容器并在新设置失败时回滚
Saving already running listener containers and rolling back if new setting fails
我有以下情况。我的应用程序从一个配置文件中读取,我在其中定义了 queues、它的排他性、线程数和一些其他细节。当应用程序启动时,它会从该配置中读取并为每个声明的条目创建 DirectMessageListenerContainer
。我将这些容器保存在一个地图中,我在其中将每个容器与我指定的自定义名称相关联。
启动时,如果发生任何故障,应用程序将无法 运行,这正是我想要的。
现在,关于这个问题。我创建了一个 reload
方法,它允许用户更改配置而无需通过 JMX 重新启动应用程序。所以,当配置文件发生变化时,如果调用了reload
方法,就会执行下面的过程。检查新配置的有效性,如果正确,则用于设置新配置。为此,我首先停止所有容器,然后销毁它们。之后,我初始化新容器。就是这样。问题是,当停止、销毁或任何其他下一步发生异常时会发生什么。我处理了异常,但问题是它会破坏当前设置或 half-baked。我想有一个回滚功能,但我不确定该怎么做。因为在检查新配置的有效性后,我将其设置为当前配置。
我可以保存当前设置,检查新的设置是否有效,如果不正确,我可以再次初始化之前的设置。但是,我可以 运行 在初始化前一个异常时进入另一个异常。
这是 reload
函数。 RabbitManager
是我创造的class,没有什么特别的,就是做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();
}
}
我希望我的问题很清楚,如果需要任何东西或者您认为当前的方法有问题,或者我可能遗漏了一些要点,请告诉我。抱歉,标题含糊不清。
为什么不只 stop()
容器,只有在新容器完好时才销毁它们。如果新配置失败,只需 start()
销毁新容器后的旧容器。
我有以下情况。我的应用程序从一个配置文件中读取,我在其中定义了 queues、它的排他性、线程数和一些其他细节。当应用程序启动时,它会从该配置中读取并为每个声明的条目创建 DirectMessageListenerContainer
。我将这些容器保存在一个地图中,我在其中将每个容器与我指定的自定义名称相关联。
启动时,如果发生任何故障,应用程序将无法 运行,这正是我想要的。
现在,关于这个问题。我创建了一个 reload
方法,它允许用户更改配置而无需通过 JMX 重新启动应用程序。所以,当配置文件发生变化时,如果调用了reload
方法,就会执行下面的过程。检查新配置的有效性,如果正确,则用于设置新配置。为此,我首先停止所有容器,然后销毁它们。之后,我初始化新容器。就是这样。问题是,当停止、销毁或任何其他下一步发生异常时会发生什么。我处理了异常,但问题是它会破坏当前设置或 half-baked。我想有一个回滚功能,但我不确定该怎么做。因为在检查新配置的有效性后,我将其设置为当前配置。
我可以保存当前设置,检查新的设置是否有效,如果不正确,我可以再次初始化之前的设置。但是,我可以 运行 在初始化前一个异常时进入另一个异常。
这是 reload
函数。 RabbitManager
是我创造的class,没有什么特别的,就是做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();
}
}
我希望我的问题很清楚,如果需要任何东西或者您认为当前的方法有问题,或者我可能遗漏了一些要点,请告诉我。抱歉,标题含糊不清。
为什么不只 stop()
容器,只有在新容器完好时才销毁它们。如果新配置失败,只需 start()
销毁新容器后的旧容器。