gpt4 book ai didi

java - 在运行时更新 Dropwizard 配置

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:47 25 4
gpt4 key购买 nike

是否可以让我的应用程序在运行时更新配置设置?我可以轻松地在我的 UI 中公开我想要的设置,但是有没有办法允许用户更新设置并使它们永久化,即将它们保存到 config.yaml 文件中?我能看到它的唯一方法是手动更新文件,然后重新启动服务器,这似乎有点受限。

最佳答案

是的。可以在运行时重新加载服务类。

Dropwizard 本身没有重新加载应用程序的方法,但 jersey 有。

Jersey 在内部使用容器对象来维护正在运行的应用程序。 Dropwizard 使用 Jersey 的 ServletContainer 类来运行应用程序。

如何在不重启的情况下重新加载应用程序 -

  1. 获取 jersey 内部使用的容器句柄

    您可以通过在启动应用程序之前在 Dropwizard 环境中注册一个 AbstractContainerLifeCycleListener 来做到这一点。并实现其 onStartup 方法如下 -

在启动应用程序的主要方法中 -

//getting the container instance
environment.jersey().register(new AbstractContainerLifecycleListener() {
@Override
public void onStartup(Container container) {
//initializing container - which will be used to reload the app
_container = container;
}

});
  1. 向您的应用添加一个方法以重新加载应用。它将接收字符串列表,这些字符串是您要重新加载的服务类的名称。此方法将使用新的自定义 DropWizardConfiguration 实例调用容器的重新加载方法。

在你的应用程序类中

 public static synchronized void reloadApp(List<String> reloadClasses) {
DropwizardResourceConfig dropwizardResourceConfig = new DropwizardResourceConfig();

for (String className : reloadClasses) {
try {
Class<?> serviceClass = Class.forName(className);
dropwizardResourceConfig.registerClasses(serviceClass);
System.out.printf(" + loaded class %s.\n", className);
} catch (ClassNotFoundException ex) {
System.out.printf(" ! class %s not found.\n", className);
}
}
_container.reload(dropwizardResourceConfig);

}

有关更多详细信息,请参阅 Jersey 示例文档 - jersey example for reload

考虑浏览 Dropwizard/Jersey 中以下文件的代码和文档以更好地理解 -

Container.java

ContainerLifeCycleListener.java

ServletContainer.java

AbstractContainerLifeCycleListener.java

DropWizardResourceConfig.java

ResourceConfig.java

关于java - 在运行时更新 Dropwizard 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27490318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com