diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bb30950f..ed7c4724a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,3 +5,4 @@ - [docs:Add license checker GitHub Action.](https://github.com/Tencent/spring-cloud-tencent/pull/841) - [refactor:move loadbalancer to discovery module.](https://github.com/Tencent/spring-cloud-tencent/pull/845) - [feature:add PolarisRateLimiterLimitedFallback spi. ](https://github.com/Tencent/spring-cloud-tencent/pull/858) +- [fix:fix the error capture of rate limit exception.](https://github.com/Tencent/spring-cloud-tencent/pull/861) diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..1deea581d --- /dev/null +++ b/codecov.yml @@ -0,0 +1,3 @@ +coverage: + status: + patch: off \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java index 258f76454..e33c6f708 100644 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java +++ b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java @@ -91,6 +91,7 @@ public class BusinessController { }).start(); } count.await(); + index.set(0); return builder.toString(); } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java index 021ba7268..df1ec9907 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java @@ -44,6 +44,7 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.NonNull; +import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.ResponseErrorHandler; import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; @@ -69,6 +70,9 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { String[] handlerBeanNames = applicationContext.getBeanNamesForType(ResponseErrorHandler.class); if (handlerBeanNames.length == 1) { + if (this.delegateHandler == null) { + this.delegateHandler = new DefaultResponseErrorHandler(); + } return; } @@ -207,7 +211,11 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter return resultRequest; } - public void setDelegateHandler(ResponseErrorHandler delegateHandler) { + protected ResponseErrorHandler getDelegateHandler() { + return this.delegateHandler; + } + + protected void setDelegateHandler(ResponseErrorHandler delegateHandler) { this.delegateHandler = delegateHandler; } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java index 437c53ba8..5581b3ca5 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java @@ -28,6 +28,7 @@ import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.polaris.api.core.ConsumerAPI; +import org.checkerframework.checker.nullness.qual.NonNull; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; @@ -40,10 +41,13 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.context.ApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.client.AbstractClientHttpResponse; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.ResponseErrorHandler; import static org.mockito.ArgumentMatchers.any; @@ -72,6 +76,9 @@ public class EnhancedRestTemplateReporterTest { @InjectMocks private EnhancedRestTemplateReporter enhancedRestTemplateReporter; + @InjectMocks + private EnhancedRestTemplateReporter enhancedRestTemplateReporter2; + @BeforeClass public static void beforeClass() { mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class); @@ -100,6 +107,24 @@ public class EnhancedRestTemplateReporterTest { enhancedRestTemplateReporter.setDelegateHandler(delegate); } + @Test + public void testSetApplicationContext() { + ApplicationContext applicationContext = mock(ApplicationContext.class); + + // test no ResponseErrorHandler + when(applicationContext.getBeanNamesForType(any(Class.class))) + .thenReturn(new String[] {"enhancedRestTemplateReporter"}); + enhancedRestTemplateReporter2.setApplicationContext(applicationContext); + Assert.assertTrue(enhancedRestTemplateReporter2.getDelegateHandler() instanceof DefaultResponseErrorHandler); + + // test one other ResponseErrorHandler + when(applicationContext.getBeanNamesForType(any(Class.class))) + .thenReturn(new String[] {"enhancedRestTemplateReporter", "mockedResponseErrorHandler"}); + when(applicationContext.getBean(anyString())).thenReturn(mock(MockedResponseErrorHandler.class)); + enhancedRestTemplateReporter2.setApplicationContext(applicationContext); + Assert.assertTrue(enhancedRestTemplateReporter2.getDelegateHandler() instanceof MockedResponseErrorHandler); + } + @Test public void testHasError() throws IOException { when(delegate.hasError(any())).thenReturn(true); @@ -156,21 +181,21 @@ public class EnhancedRestTemplateReporterTest { verify(delegate).handleError(uri, HttpMethod.GET, response); } - class MockedClientHttpResponse extends AbstractClientHttpResponse { + static class MockedClientHttpResponse extends AbstractClientHttpResponse { - private HttpHeaders headers; + private final HttpHeaders headers; MockedClientHttpResponse() { this.headers = new HttpHeaders(); } @Override - public int getRawStatusCode() throws IOException { + public int getRawStatusCode() { return 0; } @Override - public String getStatusText() throws IOException { + public String getStatusText() { return null; } @@ -194,4 +219,12 @@ public class EnhancedRestTemplateReporterTest { return HttpStatus.OK; } } + + private static class MockedResponseErrorHandler extends DefaultResponseErrorHandler { + + @Override + public void handleError(@NonNull ClientHttpResponse response) { + } + + } }