2017-04-03 68 views
1

当它工作时,Spring很酷。但是我无法理解解决单身人士间歇性故障/重试问题的最佳方法。如何设置Spring上下文来恢复/处理临时资源故障

让我举两个具体的例子:

  • SessionFactory的有线连接起来
  • Hashicorp库有线连接起来

在这两种情况下,我们有一个远程服务器,这是相当可靠,但是如果它在特定容器类的初始化过程中发生呃逆(比如持有一些Vault秘密或SessionFactory的那个类),那么可以做什么来重试?

+0

我加入了故事和场景:我用spring-vault启动了我的应用程序,Vault容器管理的启动速度比我的应用程序慢。该应用通过VaultPropertySource配置调用Vault,并且失败。这使我的整个容器和应用程序失败。我没有看到文档中的重试机制选项。有没有或将要实施? 如果我从错误的角度看待这个问题,请改变我的观点:) –

回答

0

Spring Vault不提供重试机制。您可以使用Spring RetryRetryTemplate钩入ClientRequestFactory

重试是一种补偿形式。在这种情况下(容器无法正常启动/在第一次请求时不健康),看起来您将缺乏适当的启动和健康检查。假设您的应用程序启动时Vault服务是健康的/启动的,但事实并非如此。

重试会有所帮助,但它不是一个解决方案,它是一个补丁。

+0

我设法在问题中实现了案例的重试机制。现在我看到spring-retry不能处理404错误,我们如何配置RestTemplate或HttpClient以重试这些HTTP状态?如hc.apache.org/httpclient-3.x/exception-handling.html hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/...。我们如何向RetryableVaultTemplate clientHttpRequestFactory提供一个自定义的HttpMethodRetryHandler? –

+0

我设法启用404的重试机制从''' @Override public VaultResponse doWithRetry(RetryContext context){ logger.debug(“log me doWithRetry”); VaultResponse response = RetryableVaultTemplate.super.read(path); (响应!=空){ 返回响应; } throw new RuntimeException(“Empty response received。Probably 404”); } });}''' –

+0

在VaultTemplate中,read方法正在检查HttpStatus.NOT_FOUND并返回null。我检查了null,并且抛出了一个RuntimeException,其中包含“Empty response received。Probably 404”消息。能够抓住实际的异常情况会很好。我怎样才能做到这一点? –