【问题标题】:How to make a dropwizard application ignore all calls until start up is complete如何让 dropwizard 应用程序忽略所有调用,直到启动完成
【发布时间】:2020-01-07 18:59:50
【问题描述】:

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

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

【问题讨论】:

  • “提供等待消息”是什么意思?您希望 JAX-RS 资源以特殊方式响应吗?
  • 是的;截至目前,当应用程序启动时,如果你在它完成初始化之前访问它,浏览器将显示“无法访问此站点”消息。我想知道端点是否有可能提供一个简单地说“应用程序启动;请稍候”或类似内容的 json。我想这将进入主应用程序类的初始化部分。

标签: java initialization filtering dropwizard


【解决方案1】:

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

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

例子:

@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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多