首页 > 解决方案 > 如何让 dropwizard 应用程序忽略所有调用,直到启动完成

问题描述

我被要求为我们的 dropwizard 应用程序设置一种方法来忽略所有调用,直到初始化完成。我们拥有的应用程序使用 guava 缓存来复制数据库;因此,所有调用都转到它而不是直接转到数据库。此缓存是在初始化期间构建的 - 因此,我想设置 dropwizard 的初始化方法以提供等待消息,直到缓存完成构建,而不是尝试接受任何调用。但是,我不确定该怎么做。

到目前为止,我确实知道任何解决方案都必须进入主类的初始化方法,并且有办法检查初始化是否完成。我试过看看 dropwizard 是否有任何检查初始化是否完成的钩子,但我没有找到任何东西。

标签: javainitializationfilteringdropwizard

解决方案


HTTP(S) 连接器仅在Application#run(T configuration, Environment environment)方法完成后启动。

您可以添加阻塞方法调用或使用 aCountDownLatch来等待缓存被填充。

例子:

@Override
public void run(Configuration configuration, Environment environment) {
    Cache dbCache = initializeCache(configuration);
    // Custom initializations
    // [...]

    populateCache(dbCache); // Blocks until the cache has been successfully populated
}

或者,如果您要异步填充缓存,则可以使用CountDownLatch

@Override
public void run(Configuration configuration, Environment environment) {
    Cache dbCache = initializeCache(configuration);
    CountDownLatch countDownLatch = new CountDownLatch(1);
    // Custom initializations
    // [...]

    asyncPopulateCache(dbCache, countDownLatch);

    countDownLatch.await(); // Blocks until the cache has been successfully populated
}

推荐阅读