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);