Spring根据需要重新加载应用程序上下文

时间:2013-12-05 15:08:10

标签: java spring

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

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

问候。

2 个答案:

答案 0 :(得分:1)

您只需重新加载需要更新配置的bean。为什么每次都有整个应用环境? 如果更新电子邮件配置,则只有电子邮件服务需要。

简单的代码段看起来像这样:

 select * from
    ( SELECT *
                     FROM Employees
                     order by salary ) A 
    where rownum = 1

答案 1 :(得分:0)

我会尝试提供一般答案。 首先,您必须了解应用程序应该如何对这些更改做出反应?

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

让我们说这些存储在数据库中,并在启动期间通过spring读取。实际上,这些属性实际上是由数据源bean使用的。 现在,当您更改数据库的主机属性(迁移到另一台服务器)时会发生什么?

现在的问题不是春天如何对这种变化作出反应,而是驱动因素如何对变化作出反应。实际上它应该使所有打开的连接无效,关闭连接池,可能清理一些应用程序(缓存,监视等),连接到另一个数据库。

这不是春天可以为你做的事情,事实上,司机应该能够处理这样的更新

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

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

关于第二个问题,您可以使用一些消息传递系统来通知组件有关更改的信息。然后实现将在更改时管理组件的侦听器。 另一个变体是使用现有工具Zoo Keeper它可以管理配置,为异步更改提供Out Of the Box支持等等。

希望这有帮助