虽然 dropwizard 不支持开箱即用的此功能,但您可以使用他们提供的工具轻松完成此功能。请注意,以下解决方案绝对适用于您提供的配置值,但它可能不适用于内置配置值。
另请注意,这不会将更新的配置值保留到config.yml。但是,这很容易实现,只需从应用程序写入配置文件即可。如果有人想编写此实现,请随时在我下面链接的示例项目中open a PR。
代码
从一个最小的配置开始:
config.yml
myConfigValue: "hello"
并且是对应的configuration文件:
ExampleConfiguration.java
public class ExampleConfiguration extends Configuration {
private String myConfigValue;
public String getMyConfigValue() {
return myConfigValue;
}
public void setMyConfigValue(String value) {
myConfigValue = value;
}
}
然后创建一个task 来更新配置:
UpdateConfigTask.java
public class UpdateConfigTask extends Task {
ExampleConfiguration config;
public UpdateConfigTask(ExampleConfiguration config) {
super("updateconfig");
this.config = config;
}
@Override
public void execute(Map<String, List<String>> parameters, PrintWriter output) {
config.setMyConfigValue("goodbye");
}
}
同样出于演示目的,创建一个resource,它允许您获取配置值:
ConfigResource.java
@Path("/config")
public class ConfigResource {
private final ExampleConfiguration config;
public ConfigResource(ExampleConfiguration config) {
this.config = config;
}
@GET
public Response handleGet() {
return Response.ok().entity(config.getMyConfigValue()).build();
}
}
最后把所有东西都连接到你的application:
ExampleApplication.java(摘录)
environment.jersey().register(new ConfigResource(configuration));
environment.admin().addTask(new UpdateConfigTask(configuration));
用法
Start up the application 然后运行:
$ curl 'http://localhost:8080/config'
hello
$ curl -X POST 'http://localhost:8081/tasks/updateconfig'
$ curl 'http://localhost:8080/config'
goodbye
工作原理
只需将相同的引用传递给ConfigResource.java 和UpdateConfigTask.java 的构造函数即可。如果您不熟悉该概念,请参见此处:
Is Java "pass-by-reference" or "pass-by-value"?
上面的链接类是我创建的一个项目,它证明了这是一个完整的解决方案。这是该项目的链接:
scottg489/dropwizard-runtime-config-example
脚注:我还没有验证这是否适用于 built in configuration。但是,您需要为自己的配置扩展的 dropwizard Configuration 类确实有各种用于内部配置的“setter”,但更新 run() 之外的那些可能不安全。
免责声明:我在这里链接的项目是我创建的。