Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 按需重新加载Spring应用程序上下文_Java_Spring - Fatal编程技术网

Java 按需重新加载Spring应用程序上下文

Java 按需重新加载Spring应用程序上下文,java,spring,Java,Spring,我有一个扩展PropertyPlacerHolderConfig的类,在这个类中,一旦启动应用程序,就会加载数据库中的所有属性。然后其余的Spring定义配置使用这些属性,比如我的Quartz任务的调度程序时间 但我现在所做的是我的应用程序的一个管理部分,客户机可以在其中修改数据库中的这些属性。但到目前为止,让应用程序使用这些新值的唯一方法是手动重新启动服务,这正是我想要避免的 注意。您只需要重新加载那些需要更新配置的bean。为什么每次都是整个应用程序上下文? 如果更新了电子邮件配置,则只有电

我有一个扩展PropertyPlacerHolderConfig的类,在这个类中,一旦启动应用程序,就会加载数据库中的所有属性。然后其余的Spring定义配置使用这些属性,比如我的Quartz任务的调度程序时间


但我现在所做的是我的应用程序的一个管理部分,客户机可以在其中修改数据库中的这些属性。但到目前为止,让应用程序使用这些新值的唯一方法是手动重新启动服务,这正是我想要避免的


注意。

您只需要重新加载那些需要更新配置的bean。为什么每次都是整个应用程序上下文? 如果更新了电子邮件配置,则只有电子邮件服务需要该配置

简单的代码片段如下所示:

@Autowired
private ApplicationContext applicationContext;

public void onEmailConfChange()
{
Properties properties = dao.getEmailConf();
EmailService emailService = (EmailService) applicationContext
            .getBean("emailService");
emailService.setConfiguration(properties);
}

我将尝试提供一个通用的答案。 首先,您必须了解您的应用程序应该如何准确地响应这些更改

例如,假设您管理表示与数据库连接的属性

假设这些存储在数据库中,并在启动期间由spring读取。这些属性很可能被数据源bean实际使用。 现在,当您更改(比如)数据库的主机属性(迁移到另一台服务器)时会发生什么情况

现在的问题不是spring如何应对这种变化,而是驾驶员如何应对这种变化。事实上,它应该使所有打开的连接失效,关闭连接池,可能清理一些应用程序内容(缓存、监视等),连接到另一个数据库

这不是spring可以为您做的事情,事实上,驱动程序应该能够处理这样的更新

现在出现了两个问题: 1.是否应在此更改后更新所有应用程序上下文? 2.如何识别和应对这种变化

至于第一个问题,答案实际上取决于您管理的属性以及组件在发生更改时真正应该做什么。 但根据经验,如果可以的话,不要重新加载整个应用程序上下文,因为它太慢了,事实上,它与重新运行整个服务没有多大区别

至于第二个问题,您可以使用一些消息传递系统将更改通知组件。然后实现监听器,该监听器将在更改时管理组件。 另一个变化是使用一个已经存在的工具,它可以管理配置,为异步更改提供开箱即用的支持,等等


希望这对
.Properties
文件中的值有所帮助?您可以使用
可重新加载的ResourceBundleMessageSource
,但任何已解析的属性都将保持这种方式。只有需要解析的新值才会有更新。我不明白您为什么要重新加载应用程序上下文。如果您的应用程序正在工作,这意味着它是在war中构建的(我假设您有web项目,如果没有指定它,请指定)并部署的。在此之后,您不能修改war,因此不能修改任何属性文件。您可以按照其他注释状态强制重新加载属性。但是,像这样的编译时集属性通常最好作为常量处理(这就是为什么动态修改它们没有太多支持的原因——您必须做一些工作才能对更改生成的事件作出反应)。如果您想拥有用户可配置的属性,您应该以某种方式实现并持久化它们,而不会因为重新部署(数据库、磁盘上由与应用程序上下文分离的配置文件支持的dao等)而崩溃。感谢您的响应。让我解释一下它是如何工作的。我有一个扩展PropertyPlacerHolderConfig的类,在这个类中,一旦启动应用程序,就会加载数据库中的所有属性。然后剩下的Spring定义配置使用这些属性,比如我的Quartz任务的调度时间。但我现在做的是应用程序的一个管理部分,客户机可以在其中修改数据库中的这些属性。但到目前为止,让应用程序使用这些新值的唯一方法是手动重新启动服务,这正是我想要避免的。