Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用重试模板捕获特定异常_Java_Spring_Resttemplate_Retrytemplate - Fatal编程技术网

Java 如何使用重试模板捕获特定异常

Java 如何使用重试模板捕获特定异常,java,spring,resttemplate,retrytemplate,Java,Spring,Resttemplate,Retrytemplate,我正在尝试呼叫多个服务,每个服务都依赖于以前的呼叫。 每次调用我都创建了自己的重试逻辑,但我最近才发现Spring重试模板,并希望使用它 因此,我创建了以下retryTemplate: RetryTemplate retryTemplate = new RetryTemplate(); FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); fixedBackOffPolicy.setBackOffPerio

我正在尝试呼叫多个服务,每个服务都依赖于以前的呼叫。 每次调用我都创建了自己的重试逻辑,但我最近才发现Spring重试模板,并希望使用它

因此,我创建了以下retryTemplate:

  RetryTemplate retryTemplate = new RetryTemplate();
  FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
  fixedBackOffPolicy.setBackOffPeriod(4000L);
  SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
  retryPolicy.setMaxAttempts(5);
  retryTemplate.setRetryPolicy(retryPolicy);
  retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
  this.retryTemplate = retryTemplate;
我正在使用retryTemplate调用这样的服务:

try
      {
         retryTemplate.execute(
            (RetryCallback<Object, Throwable>) retryContext -> *Call serivce via restTemplate etc. Returns an object of XYZ*);
      } catch (Throwable throwable)
      {
         throwable.printStackTrace();
      }
试试看
{
retryTemplate.execute(
(RetryCallback)retryContext->*通过restTemplate等调用serivce。返回XYZ*的对象;
}捕捉(可抛可抛)
{
printStackTrace();
}
但是,当我们不断地用大量请求轰炸服务时,调用有时会抛出ResourceAccessException(当服务承受巨大压力时,这是正常的接收方式吗?),因此我想捕捉它。我可以这样做吗:

try
  {
     retryTemplate.execute(
        (RetryCallback<Object, Throwable>) retryContext -> Optional.of(restClient.post(restTemplate, aauiUrlLeadUri, requestBody, LeadPersistResponse.class)));
  } catch (ResourceAccessException exception)
  {
     exception.printStackTrace();
     *perform logic to handle exception*
  } catch (Throwable throwable)
  {
     throwable.printStackTrace();
  }
试试看
{
retryTemplate.execute(
(RetryCallback)retryContext->Optional.of(restClient.post(restTemplate,aauiUrlLeadUri,requestBody,LeadPersistResponse.class));
}捕获(ResourceAccessException异常)
{
异常。printStackTrace();
*执行逻辑以处理异常*
}捕捉(可抛可抛)
{
printStackTrace();
}

或者我可以简单地将处理excpeiton的逻辑放在
catch(Throwable Throwable)
块中吗?

您应该从stacktrace检查
ResourceAccessException
的根本原因。例如,端点可能会告诉您对呼叫进行速率限制。查看堆栈跟踪,它是由以下原因引起的:
:java.net.SocketException:来自服务器的文件意外结束
。。我是否应该捕获该异常而不是ResourceAccessException?如果您愿意的话。异常处理是基本Java,如果使用Spring Boot,您应该知道这一点。您应该从stacktrace检查
ResourceAccessException
的根本原因。例如,端点可能会告诉您对呼叫进行速率限制。查看堆栈跟踪,它是由以下原因引起的:
:java.net.SocketException:来自服务器的文件意外结束
。。我是否应该捕获该异常而不是ResourceAccessException?如果您愿意的话。异常处理是基本的Java,如果使用SpringBoot,您应该知道这一点。