在Dropwizard中禁用静态资产的缓存

时间:2014-12-03 18:18:18

标签: java caching assets cache-control dropwizard

我有一个带有rest api的Dropwizard网络服务器,它还提供一些静态内容,如html,css,javascript和jpg图像。不幸的是,当我更改html或添加另一个图像时,总是需要重新启动服务器才能使更改生效。

当我认为这可能是缓存问题时,我探讨了bazaarvoice's Configurable Assets Bundle

这是我添加到配置类的内容:

@Valid
@NotNull
@JsonProperty
private final AssetsConfiguration assets = new AssetsConfiguration();

在主要班级

@Override
public void initialize(Bootstrap<MyConfiguration> bootstrap) {
    // ...
    CacheBuilderSpec cacheBuilderSpec = CacheBuilderSpec.disableCaching();
    bootstrap.addBundle(new ConfiguredAssetsBundle("/html", cacheBuilderSpec, "/", "index.html", "Static assets"));
}

@Override
public void run(MyConfiguration config, Environment env) {
    env.jersey().setUrlPattern("/api/*");
    // ...
}

yaml配置没有变化。

静态文件位于 src / main / resources / html 中。 如何禁用缓存,以便Dropwizard立即显示更改?

第二个问题,我如何让Dropwizard跟踪资产目录中的符号链接?

更新

我在ConfiguredAssetsBundle源中找到了这个:

// Let the cache spec from the configuration override the one specified in the code
CacheBuilderSpec spec = (config.getCacheSpec() != null)
    ? CacheBuilderSpec.parse(config.getCacheSpec())
    : cacheBuilderSpec;

这肯定会覆盖使用yaml文件中的配置在代码中设置的缓存构建器规范。追加后

assets:
  cacheSpec: maximumSize=0

到配置,调试器显示最大大小现在为0.但是,行为没有改变。

1 个答案:

答案 0 :(得分:1)

静态内容不会因为您需要重新启动而改变,但因为正在运行的服务器实际上是在目标目录下提供文件。更改此目录中的文件只会混淆事情(因此它不是真正的解决方案),但更改几行并等待一秒以验证服务器现在是否提供修改后的文件而无需重新启动。

作为一个解决方案,我更喜欢在eclipse中打开dropwizard项目作为maven项目,并使用mvn exec:java在终端上使用exec-maven-plugin运行项目。 Eclipse会在文件更改时更新目标目录,但需要几秒钟,具体取决于项目的大小。