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/08/31 00:43:28 UTC

[incubator-servicecomb-saga] 02/07: SCB-876 Refactor MethodCheckingCallback & create participate annotation callback processor.

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-saga.git

commit fa995791a790de7f3bd51ccce59151503d2b2655
Author: cherrylzhao <zh...@126.com>
AuthorDate: Wed Aug 29 18:08:12 2018 +0800

    SCB-876 Refactor MethodCheckingCallback & create participate annotation callback processor.
---
 ...mpensationContext.java => CallbackContext.java} |  4 +-
 .../saga/omega/spring/OmegaSpringConfig.java       | 13 ++++--
 .../spring/CompensableAnnotationProcessor.java     |  6 +--
 .../spring/CompensableMethodCheckingCallback.java  | 35 ++------------
 .../transaction/spring/MethodCheckingCallback.java | 53 ++++++++++++++++++++++
 ...or.java => ParticipateAnnotationProcessor.java} | 12 ++---
 .../spring/ParticipateMethodCheckingCallback.java  | 40 ++++++++++++++++
 .../spring/TransactionAspectConfig.java            | 14 ++++--
 .../spring/TransactionInterceptionTest.java        |  6 +--
 .../transaction/CompensationMessageHandler.java    |  6 +--
 .../CompensationMessageHandlerTest.java            |  4 +-
 11 files changed, 137 insertions(+), 56 deletions(-)

diff --git a/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CompensationContext.java b/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CallbackContext.java
similarity index 96%
rename from omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CompensationContext.java
rename to omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CallbackContext.java
index 0823240..f5dbf6d 100644
--- a/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CompensationContext.java
+++ b/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CallbackContext.java
@@ -26,13 +26,13 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class CompensationContext {
+public class CallbackContext {
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final Map<String, CompensationContextInternal> contexts = new ConcurrentHashMap<>();
   private final OmegaContext omegaContext;
 
-  public CompensationContext(OmegaContext omegaContext) {
+  public CallbackContext(OmegaContext omegaContext) {
     this.omegaContext = omegaContext;
   }
 
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
index 624ef84..2db09dd 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
+++ b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
@@ -23,7 +23,7 @@ import io.grpc.ManagedChannelBuilder;
 import org.apache.servicecomb.saga.omega.connector.grpc.AlphaClusterConfig;
 import org.apache.servicecomb.saga.omega.connector.grpc.GrpcTccEventService;
 import org.apache.servicecomb.saga.omega.connector.grpc.LoadBalancedClusterMessageSender;
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 import org.apache.servicecomb.saga.omega.context.IdGenerator;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.apache.servicecomb.saga.omega.context.ServiceConfig;
@@ -52,9 +52,14 @@ class OmegaSpringConfig {
     return new OmegaContext(idGenerator);
   }
 
-  @Bean
-  CompensationContext compensationContext(OmegaContext omegaContext) {
-    return new CompensationContext(omegaContext);
+  @Bean(name = {"compensationContext"})
+  CallbackContext compensationContext(OmegaContext omegaContext) {
+    return new CallbackContext(omegaContext);
+  }
+
+  @Bean(name = {"coordinateContext"})
+  CallbackContext coordinateContext(OmegaContext omegaContext) {
+    return new CallbackContext(omegaContext);
   }
 
   @Bean
diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationProcessor.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationProcessor.java
index 7d7d45f..790394f 100644
--- a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationProcessor.java
+++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationProcessor.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.saga.omega.transaction.spring;
 
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
@@ -27,9 +27,9 @@ class CompensableAnnotationProcessor implements BeanPostProcessor {
 
   private final OmegaContext omegaContext;
 
-  private final CompensationContext compensationContext;
+  private final CallbackContext compensationContext;
 
-  CompensableAnnotationProcessor(OmegaContext omegaContext, CompensationContext compensationContext) {
+  CompensableAnnotationProcessor(OmegaContext omegaContext, CallbackContext compensationContext) {
     this.omegaContext = omegaContext;
     this.compensationContext = compensationContext;
   }
diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java
index 90d8b06..540074c 100644
--- a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java
+++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java
@@ -17,26 +17,15 @@
 
 package org.apache.servicecomb.saga.omega.transaction.spring;
 
-import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Method;
-
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
-import org.apache.servicecomb.saga.omega.transaction.OmegaException;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 import org.apache.servicecomb.saga.omega.transaction.annotations.Compensable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.util.ReflectionUtils.MethodCallback;
 
-class CompensableMethodCheckingCallback implements MethodCallback {
-  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  private final Object bean;
+class CompensableMethodCheckingCallback extends MethodCheckingCallback implements MethodCallback {
 
-  private final CompensationContext compensationContext;
-
-  CompensableMethodCheckingCallback(Object bean, CompensationContext compensationContext) {
-    this.bean = bean;
-    this.compensationContext = compensationContext;
+  public CompensableMethodCheckingCallback(Object bean, CallbackContext callbackContext) {
+    super(bean, callbackContext);
   }
 
   @Override
@@ -44,21 +33,7 @@ class CompensableMethodCheckingCallback implements MethodCallback {
     if (!method.isAnnotationPresent(Compensable.class)) {
       return;
     }
-
     String compensationMethod = method.getAnnotation(Compensable.class).compensationMethod();
-
-    try {
-      compensationContext.addCompensationContext(method, bean);
-
-      if (!compensationMethod.isEmpty()) {
-        Method signature = bean.getClass().getDeclaredMethod(compensationMethod, method.getParameterTypes());
-        compensationContext.addCompensationContext(signature, bean);
-        LOG.debug("Found compensation method [{}] in {}", compensationMethod, bean.getClass().getCanonicalName());
-      }
-    } catch (NoSuchMethodException e) {
-      throw new OmegaException(
-          "No such compensation method [" + compensationMethod + "] found in " + bean.getClass().getCanonicalName(),
-          e);
-    }
+    loadMethodContext(method, compensationMethod);
   }
 }
diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/MethodCheckingCallback.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/MethodCheckingCallback.java
new file mode 100644
index 0000000..286ff2c
--- /dev/null
+++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/MethodCheckingCallback.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.omega.transaction.spring;
+
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Method;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
+import org.apache.servicecomb.saga.omega.transaction.OmegaException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.ReflectionUtils.MethodCallback;
+
+public abstract class MethodCheckingCallback implements MethodCallback {
+
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  private final Object bean;
+
+  private final CallbackContext callbackContext;
+
+  public MethodCheckingCallback(Object bean, CallbackContext callbackContext) {
+    this.bean = bean;
+    this.callbackContext = callbackContext;
+  }
+
+  protected void loadMethodContext(Method method, String ... candidates) {
+    for (String each : candidates) {
+      try {
+        Method signature = bean.getClass().getDeclaredMethod(each, method.getParameterTypes());
+        callbackContext.addCompensationContext(signature, bean);
+        LOG.debug("Found callback method [{}] in {}", each, bean.getClass().getCanonicalName());
+      } catch (NoSuchMethodException ex) {
+        throw new OmegaException(
+            "No such callback method [" + each + "] found in " + bean.getClass().getCanonicalName(), ex);
+      }
+    }
+  }
+}
diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationProcessor.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/ParticipateAnnotationProcessor.java
similarity index 80%
copy from omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationProcessor.java
copy to omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/ParticipateAnnotationProcessor.java
index 7d7d45f..5cef9ff 100644
--- a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationProcessor.java
+++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/ParticipateAnnotationProcessor.java
@@ -17,21 +17,21 @@
 
 package org.apache.servicecomb.saga.omega.transaction.spring;
 
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.util.ReflectionUtils;
 
-class CompensableAnnotationProcessor implements BeanPostProcessor {
+class ParticipateAnnotationProcessor implements BeanPostProcessor {
 
   private final OmegaContext omegaContext;
 
-  private final CompensationContext compensationContext;
+  private final CallbackContext callbackContext;
 
-  CompensableAnnotationProcessor(OmegaContext omegaContext, CompensationContext compensationContext) {
+  ParticipateAnnotationProcessor(OmegaContext omegaContext, CallbackContext callbackContext) {
     this.omegaContext = omegaContext;
-    this.compensationContext = compensationContext;
+    this.callbackContext = callbackContext;
   }
 
   @Override
@@ -49,7 +49,7 @@ class CompensableAnnotationProcessor implements BeanPostProcessor {
   private void checkMethod(Object bean) {
     ReflectionUtils.doWithMethods(
         bean.getClass(),
-        new CompensableMethodCheckingCallback(bean, compensationContext));
+        new ParticipateMethodCheckingCallback(bean, callbackContext));
   }
 
   private void checkFields(Object bean) {
diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/ParticipateMethodCheckingCallback.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/ParticipateMethodCheckingCallback.java
new file mode 100644
index 0000000..a96aad2
--- /dev/null
+++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/ParticipateMethodCheckingCallback.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.omega.transaction.spring;
+
+import java.lang.reflect.Method;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
+import org.apache.servicecomb.saga.omega.transaction.annotations.Participate;
+import org.springframework.util.ReflectionUtils.MethodCallback;
+
+public class ParticipateMethodCheckingCallback extends MethodCheckingCallback implements MethodCallback {
+
+  public ParticipateMethodCheckingCallback(Object bean, CallbackContext callbackContext) {
+    super(bean, callbackContext);
+  }
+
+  @Override
+  public void doWith(Method method) throws IllegalArgumentException {
+    if (!method.isAnnotationPresent(Participate.class)) {
+      return;
+    }
+    String confirmMethod = method.getAnnotation(Participate.class).confirmMethod();
+    String cancelMethod = method.getAnnotation(Participate.class).cancelMethod();
+    loadMethodContext(method, confirmMethod, cancelMethod);
+  }
+}
diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionAspectConfig.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionAspectConfig.java
index 73d02cf..26c6512 100644
--- a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionAspectConfig.java
+++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionAspectConfig.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.saga.omega.transaction.spring;
 
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.apache.servicecomb.saga.omega.transaction.CompensationMessageHandler;
 import org.apache.servicecomb.saga.omega.transaction.MessageHandler;
@@ -28,6 +28,7 @@ import org.apache.servicecomb.saga.omega.transaction.tcc.CoordinateMessageHandle
 import org.apache.servicecomb.saga.omega.transaction.tcc.TccEventService;
 import org.apache.servicecomb.saga.omega.transaction.tcc.TccParticipatorAspect;
 import org.apache.servicecomb.saga.omega.transaction.tcc.TccStartAspect;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
@@ -38,7 +39,8 @@ import org.springframework.core.annotation.Order;
 public class TransactionAspectConfig {
 
   @Bean
-  MessageHandler messageHandler(MessageSender sender, CompensationContext context, OmegaContext omegaContext) {
+  MessageHandler messageHandler(MessageSender sender,
+      @Qualifier("compensationContext") CallbackContext context, OmegaContext omegaContext) {
     return new CompensationMessageHandler(sender, context);
   }
 
@@ -56,7 +58,7 @@ public class TransactionAspectConfig {
 
   @Bean
   CompensableAnnotationProcessor compensableAnnotationProcessor(OmegaContext omegaContext,
-      CompensationContext compensationContext) {
+      @Qualifier("compensationContext") CallbackContext compensationContext) {
     return new CompensableAnnotationProcessor(omegaContext, compensationContext);
   }
 
@@ -77,4 +79,10 @@ public class TransactionAspectConfig {
   TccParticipatorAspect tccParticipatorAspect(TccEventService tccEventService, OmegaContext context) {
     return new TccParticipatorAspect(tccEventService, context);
   }
+
+  @Bean
+  ParticipateAnnotationProcessor participateAnnotationProcessor(OmegaContext omegaContext,
+      @Qualifier("coordinateContext") CallbackContext coordinateContext) {
+    return new ParticipateAnnotationProcessor(omegaContext, coordinateContext);
+  }
 }
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
index 5f3f708..123dc1f 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
@@ -40,7 +40,7 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 import org.apache.servicecomb.saga.omega.context.IdGenerator;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.apache.servicecomb.saga.omega.transaction.AlphaResponse;
@@ -408,8 +408,8 @@ public class TransactionInterceptionTest {
     private final List<String> messages = new ArrayList<>();
 
     @Bean
-    CompensationContext recoveryContext(OmegaContext omegaContext) {
-      return new CompensationContext(omegaContext);
+    CallbackContext recoveryContext(OmegaContext omegaContext) {
+      return new CallbackContext(omegaContext);
     }
 
     @Bean
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandler.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandler.java
index fe2eea5..75501b9 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandler.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandler.java
@@ -17,14 +17,14 @@
 
 package org.apache.servicecomb.saga.omega.transaction;
 
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 
 public class CompensationMessageHandler implements MessageHandler {
   private final MessageSender sender;
 
-  private final CompensationContext context;
+  private final CallbackContext context;
 
-  public CompensationMessageHandler(MessageSender sender, CompensationContext context) {
+  public CompensationMessageHandler(MessageSender sender, CallbackContext context) {
     this.sender = sender;
     this.context = context;
   }
diff --git a/omega/omega-transaction/src/test/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandlerTest.java b/omega/omega-transaction/src/test/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandlerTest.java
index ab1f988..b9edb07 100644
--- a/omega/omega-transaction/src/test/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandlerTest.java
+++ b/omega/omega-transaction/src/test/java/org/apache/servicecomb/saga/omega/transaction/CompensationMessageHandlerTest.java
@@ -27,7 +27,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.servicecomb.saga.common.EventType;
-import org.apache.servicecomb.saga.omega.context.CompensationContext;
+import org.apache.servicecomb.saga.omega.context.CallbackContext;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -68,7 +68,7 @@ public class CompensationMessageHandlerTest {
   private final String compensationMethod = getClass().getCanonicalName();
   private final String payload = uniquify("blah");
 
-  private final CompensationContext context = mock(CompensationContext.class);
+  private final CallbackContext context = mock(CallbackContext.class);
 
   private final CompensationMessageHandler handler = new CompensationMessageHandler(sender, context);