You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/06/14 10:29:35 UTC

[incubator-servicecomb-java-chassis] 01/02: [SCB-667] fix gracefully shutdown is not work in some case

This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 3619109a94aed15c537be8a282d376ddf007c46d
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Thu Jun 14 15:38:47 2018 +0800

    [SCB-667] fix gracefully shutdown is not work in some case
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../common/rest/AbstractRestInvocation.java          |  9 +++++++--
 .../common/rest/TestAbstractRestInvocation.java      |  4 ++++
 .../java/org/apache/servicecomb/core/SCBEngine.java  |  2 +-
 .../core/invocation/InvocationFactory.java           |  2 ++
 .../servicecomb/core/unittest/UnitTestMeta.java      |  4 ++++
 .../apache/servicecomb/provider/pojo/Invoker.java    |  1 +
 .../springmvc/reference/CseClientHttpRequest.java    |  5 ++---
 .../reference/TestCseClientHttpRequest.java          | 18 +++++++-----------
 .../async/CseAsyncClientHttpRequestTest.java         | 20 ++------------------
 .../transport/highway/HighwayServerInvoke.java       | 14 +++++++++-----
 10 files changed, 39 insertions(+), 40 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
index 81e6fc9..cb4413b 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
@@ -108,7 +108,13 @@ public abstract class AbstractRestInvocation {
   }
 
   protected void scheduleInvocation() {
-    createInvocation();
+    try {
+      createInvocation();
+    } catch (IllegalStateException e) {
+      sendFailResponse(e);
+      return;
+    }
+
     invocation.onStart();
     OperationMeta operationMeta = restOperationMeta.getOperationMeta();
 
@@ -161,7 +167,6 @@ public abstract class AbstractRestInvocation {
 
   protected Response prepareInvoke() throws Throwable {
     this.initProduceProcessor();
-
     this.setContext();
     invocation.getHandlerContext().put(RestConst.REST_REQUEST, requestEx);
 
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
index 6e5df50..e8d4d7f 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
@@ -36,6 +36,8 @@ import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.Handler;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.core.SCBEngine;
+import org.apache.servicecomb.core.SCBStatus;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.MicroserviceMetaManager;
 import org.apache.servicecomb.core.definition.OperationMeta;
@@ -121,11 +123,13 @@ public class TestAbstractRestInvocation {
   @BeforeClass
   public static void classSetup() {
     EventManager.eventBus = new EventBus();
+    SCBEngine.getInstance().setStatus(SCBStatus.UP);
   }
 
   @AfterClass
   public static void classTeardown() {
     EventManager.eventBus = new EventBus();
+    SCBEngine.getInstance().setStatus(SCBStatus.DOWN);
   }
 
   @Before
diff --git a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
index 4d2f157..e274a18 100644
--- a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
+++ b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
@@ -273,7 +273,7 @@ public class SCBEngine {
     }
   }
 
-  protected void ensureStatusUp() {
+  public void ensureStatusUp() {
     SCBStatus currentStatus = getStatus();
     if (!SCBStatus.UP.equals(currentStatus)) {
       throw new IllegalStateException(
diff --git a/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java b/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java
index 8410d93..8c72f93 100644
--- a/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java
+++ b/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.core.invocation;
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
@@ -68,6 +69,7 @@ public final class InvocationFactory {
   public static Invocation forProvider(Endpoint endpoint,
       OperationMeta operationMeta,
       Object[] swaggerArguments) {
+    SCBEngine.getInstance().ensureStatusUp();
     return new Invocation(endpoint,
         operationMeta,
         swaggerArguments);
diff --git a/core/src/main/java/org/apache/servicecomb/core/unittest/UnitTestMeta.java b/core/src/main/java/org/apache/servicecomb/core/unittest/UnitTestMeta.java
index 832ea64..fd1eece 100644
--- a/core/src/main/java/org/apache/servicecomb/core/unittest/UnitTestMeta.java
+++ b/core/src/main/java/org/apache/servicecomb/core/unittest/UnitTestMeta.java
@@ -61,6 +61,10 @@ public class UnitTestMeta {
 
   private ConsumerProviderManager consumerProviderManager;
 
+  public ConsumerProviderManager getConsumerProviderManager() {
+    return consumerProviderManager;
+  }
+
   private ConsumerSchemaFactory consumerSchemaFactory;
 
   private SchemaLoader schemaLoader = new SchemaLoader() {
diff --git a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java
index d4d279c..05cd2fd 100644
--- a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java
+++ b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java
@@ -57,6 +57,7 @@ public class Invoker implements InvocationHandler {
 
     // initialized and meta not changed
     public boolean isValid() {
+      SCBEngine.getInstance().ensureStatusUp();
       return swaggerConsumer != null && microserviceMeta == referenceConfig.getMicroserviceMeta();
     }
   }
diff --git a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java
index 1e85f5a..ec9add3 100644
--- a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java
+++ b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java
@@ -29,8 +29,8 @@ import org.apache.servicecomb.common.rest.codec.RestCodec;
 import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
 import org.apache.servicecomb.common.rest.locator.OperationLocator;
 import org.apache.servicecomb.common.rest.locator.ServicePathManager;
-import org.apache.servicecomb.core.CseContext;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.invocation.InvocationFactory;
 import org.apache.servicecomb.core.provider.consumer.InvokerUtils;
@@ -149,8 +149,7 @@ public class CseClientHttpRequest implements ClientHttpRequest {
   protected RequestMeta createRequestMeta(String httpMethod, URI uri) {
     String microserviceName = uri.getAuthority();
 
-    ReferenceConfig referenceConfig = CseContext.getInstance().getConsumerProviderManager()
-        .getReferenceConfig(microserviceName);
+    ReferenceConfig referenceConfig = SCBEngine.getInstance().getReferenceConfigForInvoke(microserviceName);
 
     MicroserviceMeta microserviceMeta = referenceConfig.getMicroserviceMeta();
     ServicePathManager servicePathManager = ServicePathManager.getServicePathManager(microserviceMeta);
diff --git a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java
index de8935d..aadf55f 100644
--- a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java
+++ b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java
@@ -37,21 +37,17 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
-import mockit.Mock;
-import mockit.MockUp;
-
 public class TestCseClientHttpRequest {
-  SCBEngine scbEngine = new SCBEngine();
+  static UnitTestMeta meta = new UnitTestMeta();
 
   @Before
   public void setup() {
-    new MockUp<SCBEngine>() {
-      @Mock
-      SCBEngine getInstance() {
-        return scbEngine;
-      }
-    };
-    scbEngine.setStatus(SCBStatus.UP);
+    SCBEngine.getInstance().setStatus(SCBStatus.UP);
+    CseContext.getInstance()
+        .getSchemaListenerManager()
+        .setSchemaListenerList(Collections.singletonList(new RestEngineSchemaListener()));
+    meta.registerSchema(new SpringmvcSwaggerGeneratorContext(), SpringmvcImpl.class);
+    SCBEngine.getInstance().setConsumerProviderManager(meta.getConsumerProviderManager());
   }
 
   @RequestMapping(path = "SpringmvcImpl")
diff --git a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
index b0e3af9..d45dc37 100644
--- a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
+++ b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
@@ -33,7 +33,6 @@ import org.apache.servicecomb.provider.springmvc.reference.CseClientHttpResponse
 import org.apache.servicecomb.swagger.generator.springmvc.SpringmvcSwaggerGeneratorContext;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.springframework.http.HttpMethod;
@@ -44,32 +43,17 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
-import mockit.Mock;
-import mockit.MockUp;
-
 public class CseAsyncClientHttpRequestTest {
   static UnitTestMeta meta = new UnitTestMeta();
 
-  SCBEngine scbEngine = new SCBEngine();
-
-  @Before
-  public void setup() {
-    new MockUp<SCBEngine>() {
-      @Mock
-      SCBEngine getInstance() {
-        return scbEngine;
-      }
-    };
-    scbEngine.setStatus(SCBStatus.UP);
-  }
-
   @BeforeClass
   public static void classSetup() {
     CseContext.getInstance()
         .getSchemaListenerManager()
         .setSchemaListenerList(Collections.singletonList(new RestEngineSchemaListener()));
-
     meta.registerSchema(new SpringmvcSwaggerGeneratorContext(), CseAsyncClientHttpRequestTestSchema.class);
+    SCBEngine.getInstance().setConsumerProviderManager(meta.getConsumerProviderManager());
+    SCBEngine.getInstance().setStatus(SCBStatus.UP);
   }
 
   @RequestMapping(path = "CseAsyncClientHttpRequestTestSchema")
diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
index 3dd6006..76342e0 100644
--- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
+++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
@@ -166,10 +166,14 @@ public class HighwayServerInvoke {
    * start time in queue.
    */
   public void execute() {
-    invocation = InvocationFactory.forProvider(endpoint,
-        operationProtobuf.getOperationMeta(),
-        null);
-    invocation.onStart();
-    operationMeta.getExecutor().execute(() -> runInExecutor());
+    try {
+      invocation = InvocationFactory.forProvider(endpoint,
+          operationProtobuf.getOperationMeta(),
+          null);
+      invocation.onStart();
+      operationMeta.getExecutor().execute(() -> runInExecutor());
+    } catch (IllegalStateException e) {
+      sendResponse(invocation.getContext(), Response.providerFailResp(e));
+    }
   }
 }

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.