diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/MockedFallbackExample.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/MockedFallbackExample.java index 019f4023e4d..3533aed2063 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/MockedFallbackExample.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/MockedFallbackExample.java @@ -30,7 +30,7 @@ public String name() { } @Override - public Response getFallbackResponse(Invocation invocation) { + public Response getFallbackResponse(Invocation invocation, Throwable error) { return Response.succResp("mockedreslut"); } } diff --git a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicy.java b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicy.java index 75b1eb4472f..c394a35d4f4 100644 --- a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicy.java +++ b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicy.java @@ -22,7 +22,7 @@ public interface FallbackPolicy { String name(); - Response getFallbackResponse(Invocation invocation); + Response getFallbackResponse(Invocation invocation, Throwable error); default void record(Invocation invocation, Response response, boolean isSuccess) { diff --git a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicyManager.java b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicyManager.java index 1382f0a9404..88f502a9eb7 100644 --- a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicyManager.java +++ b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FallbackPolicyManager.java @@ -39,7 +39,7 @@ public static void record(String type, Invocation invocation, Response response, public static Response getFallbackResponse(String type, Throwable error, Invocation invocation) { FallbackPolicy policy = getPolicy(type, invocation); if (policy != null) { - return policy.getFallbackResponse(invocation); + return policy.getFallbackResponse(invocation, error); } else { return Response.failResp(invocation.getInvocationType(), BizkeeperExceptionUtils diff --git a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FromCacheFallbackPolicy.java b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FromCacheFallbackPolicy.java index e992e196a09..2e6314b27e5 100644 --- a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FromCacheFallbackPolicy.java +++ b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/FromCacheFallbackPolicy.java @@ -35,7 +35,7 @@ public String name() { } @Override - public Response getFallbackResponse(Invocation invocation) { + public Response getFallbackResponse(Invocation invocation, Throwable error) { if (cachedResponse.get(invocation.getInvocationQualifiedName()) != null) { return cachedResponse.get(invocation.getInvocationQualifiedName()); } else { diff --git a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ReturnNullFallbackPolicy.java b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ReturnNullFallbackPolicy.java index b4b0a5fa99f..1b4d6e0f430 100644 --- a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ReturnNullFallbackPolicy.java +++ b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ReturnNullFallbackPolicy.java @@ -30,7 +30,7 @@ public String name() { } @Override - public Response getFallbackResponse(Invocation invocation) { + public Response getFallbackResponse(Invocation invocation, Throwable error) { return Response.succResp(null); } } diff --git a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ThrowExceptionFallbackPolicy.java b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ThrowExceptionFallbackPolicy.java index 1376510900d..1c74e4a4dba 100644 --- a/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ThrowExceptionFallbackPolicy.java +++ b/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ThrowExceptionFallbackPolicy.java @@ -30,11 +30,11 @@ public String name() { } @Override - public Response getFallbackResponse(Invocation invocation) { + public Response getFallbackResponse(Invocation invocation, Throwable error) { return Response.failResp(invocation.getInvocationType(), BizkeeperExceptionUtils .createBizkeeperException(BizkeeperExceptionUtils.SERVICECOMB_BIZKEEPER_FALLBACK, - null, + error, invocation.getOperationMeta().getMicroserviceQualifiedName())); } } diff --git a/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestBizkeeperHandler.java b/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestBizkeeperHandler.java index 9d049cb920f..cb4656c3216 100644 --- a/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestBizkeeperHandler.java +++ b/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestBizkeeperHandler.java @@ -159,7 +159,8 @@ public void testHandleInError() throws Exception { .thenReturn("testHandleInError"); FallbackPolicy policy = Mockito.mock(FallbackPolicy.class); Mockito.when(policy.name()).thenReturn("throwException"); - Mockito.when(policy.getFallbackResponse(Mockito.any(Invocation.class))).thenThrow(new RuntimeException()); + Mockito.when(policy.getFallbackResponse(Mockito.any(Invocation.class), Mockito.any(null))) + .thenThrow(new RuntimeException()); FallbackPolicyManager.addPolicy(policy); System.setProperty("servicecomb.fallbackpolicy.groupname.testHandleInError.policy", "throwException"); Mockito.doAnswer(new Answer() { diff --git a/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestFallbackPolicyManager.java b/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestFallbackPolicyManager.java index b2545998300..4860146aa86 100644 --- a/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestFallbackPolicyManager.java +++ b/handlers/handler-bizkeeper/src/test/java/org/apache/servicecomb/bizkeeper/TestFallbackPolicyManager.java @@ -20,6 +20,7 @@ import org.apache.servicecomb.core.definition.OperationMeta; import org.apache.servicecomb.core.exception.CseException; import org.apache.servicecomb.swagger.invocation.Response; +import org.apache.servicecomb.swagger.invocation.exception.InvocationException; import org.junit.Assert; import org.junit.Test; @@ -33,6 +34,42 @@ public void testFallbackPolicyManager(final @Mocked Configuration config, final FallbackPolicyManager.addPolicy(new ReturnNullFallbackPolicy()); FallbackPolicyManager.addPolicy(new ThrowExceptionFallbackPolicy()); FallbackPolicyManager.addPolicy(new FromCacheFallbackPolicy()); + FallbackPolicyManager.addPolicy(new FallbackPolicy() { + private static final String CUSTOM = "custom"; + + @Override + public String name() { + return CUSTOM; + } + + @Override + public Response getFallbackResponse(Invocation invocation, Throwable error) { + if (error instanceof InvocationException) { + return Response.succResp("test"); + } + if (error instanceof RuntimeException) { + return Response.succResp("runtime"); + } + return null; + } + }); + + new Expectations() { + { + invocation.getMicroserviceName(); + result = "testservice"; + invocation.getOperationMeta(); + result = operation; + operation.getMicroserviceQualifiedName(); + result = "testservice.schema.custom"; + config.getFallbackPolicyPolicy("Consumer", "testservice", "testservice.schema.custom"); + result = "custom"; + } + }; + + Assert.assertEquals("runtime", + FallbackPolicyManager.getFallbackResponse("Consumer", new RuntimeException(), invocation) + .getResult()); new Expectations() { {