Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保存已运行的侦听器容器,并在新设置失败时回滚_Java_Spring Boot_Rabbitmq_Spring Amqp - Fatal编程技术网

Java 保存已运行的侦听器容器,并在新设置失败时回滚

Java 保存已运行的侦听器容器,并在新设置失败时回滚,java,spring-boot,rabbitmq,spring-amqp,Java,Spring Boot,Rabbitmq,Spring Amqp,我有下面的场景。我的应用程序从一个配置文件中读取数据,我在该文件中定义了队列、其排他性、线程数和其他一些细节。当应用程序启动时,它从该配置中读取数据,并为每个声明的条目创建DirectMessageListenerContainer。我将这些容器保存在一个映射中,在该映射中,我将每个容器与给定的自定义名称相关联 在启动时,若发生任何故障,应用程序将无法运行,这正是我想要的。 现在,关于这个问题。我创建了一个reload方法,允许用户更改配置,而无需通过JMX重新启动应用程序。因此,当更改配置文件

我有下面的场景。我的应用程序从一个配置文件中读取数据,我在该文件中定义了队列、其排他性、线程数和其他一些细节。当应用程序启动时,它从该配置中读取数据,并为每个声明的条目创建
DirectMessageListenerContainer
。我将这些容器保存在一个映射中,在该映射中,我将每个容器与给定的自定义名称相关联

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

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

这里是
重新加载
功能
RabbitManager
是我创建的类,它没有什么特殊的功能,只是执行
停止
销毁
等操作

公共字符串重载配置(){
新规则;
//检查新规则的有效性,设置它,处理异常。。。
试一试{
//制定新规则
//规则变量保存当前规则
规则=新规则;
//基本上,所有容器中的调用都会停止
rabbitManager.stopAll();
//基本上,所有容器中的调用都会被销毁
rabbitManager.destroyAllContainers();
兔子经理
.init(rules)//初始化空映射并将规则设置为新规则。
.registerListeners();//读取规则并为每个设置创建DirectMessageListenerContainer
log.info(“配置已成功更改并停止”);
//返回用于jConsole/monitoring
return“配置已成功更改并停止”;
}捕获(例外情况除外){
log.error(“发生异常-”+ex.getMessage(),ex);
//返回用于jConsole/monitoring
返回“异常:”+ex.getMessage();
}
}

我希望我的问题是清楚的,如果有什么需要,或者你认为目前的方法有问题,或者我遗漏了一些要点,请让我知道。不过,很抱歉标题含糊不清。

你为什么不停止(容器),只在新容器完好时销毁它们呢。如果新配置失败,在销毁新容器后,只需
start()
旧容器。

这是一个很好的建议,我一定会尝试。然而,它是100%故障安全的吗?我的意思是,
停止
销毁
启动
,这些方法都会引发异常。如果注册新的,这不是问题。但是,如果在尝试启动旧容器时抛出异常,请重试。那我该怎么办?我搜索了源代码,这些方法可以抛出大量运行时异常。尽管如此,我可以在没有故障的情况下处理,但系统状态将再次被破坏,不是吗?为什么它们无法启动?如果它们在重新启动之前起作用,则在重新启动时不应出现任何异常(除非其他情况发生了更改,例如代理上的用户凭据)。老实说,我不知道原因,这就是为什么我试图找到一种方法来处理我甚至没有想到的情况。因此,可以安全地假设,除了凭证更改之外,不会有任何问题。非常感谢,加里·拉塞尔。