[
https://issues.apache.org/jira/browse/SCB-963?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16658031#comment-16658031
]
ASF GitHub Bot commented on SCB-963:
WillemJiang closed pull request #321: SCB-963 Make saga and tcc callback method
transactional
URL: https://github.com/apache/incubator-servicecomb-saga/pull/321
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CallbackContext.java
b/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CallbackContext.java
index 0fe2613c..cf5ab508 100644
---
a/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CallbackContext.java
+++
b/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CallbackContext.java
@@ -35,9 +35,9 @@ public CallbackContext(OmegaContext omegaContext) {
this.omegaContext = omegaContext;
}
- public void addCallbackContext(Method compensationMethod, Object target) {
+ public void addCallbackContext(String key, Method compensationMethod, Object
target) {
compensationMethod.setAccessible(true);
-contexts.put(compensationMethod.toString(), new
CallbackContextInternal(target, compensationMethod));
+contexts.put(key, new CallbackContextInternal(target, compensationMethod));
}
public void apply(String globalTxId, String localTxId, String
callbackMethod, Object... payloads) {
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 790394f7..254c3e73 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
@@ -36,13 +36,13 @@
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
-checkMethod(bean);
-checkFields(bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
+checkMethod(bean);
+checkFields(bean);
return bean;
}
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
index 8a2ac138..6c523134 100644
---
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
@@ -18,11 +18,15 @@
package org.apache.servicecomb.saga.omega.transaction.spring;
import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Field;
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.aop.framework.AdvisedSupport;
+import org.springframework.aop.framework.AopProxy;
+import org.springframework.aop.support.AopUtils;
import org.springframework.util.ReflectionUtils.MethodCallback;
public abstract class MethodCheckingCallback implements MethodCallback {
@@ -45,12 +49,50 @@ protected void loadMethodContext(Method method, String ...
candidates) {
for (String each : candidates) {
try {
Method signature = bean.getClass().getDeclaredMethod(each,
method.getParameterTypes());
-callbackContext.addCallbackContext(signature, bean);
+String key = getTargetBean(bean).getClass().getDeclaredMethod(each,
method.getParameterTypes()).toString();
+callbackContext.addCallbackContext(key, signature, bean);
LOG.debug("Found callback method [{}] in {}", each,
bean.getClass().getCanonicalName());
- } catch (NoSuchMethodException ex) {
+ } catch (Exception ex) {
throw new OmegaException(
"No such " + callbackType + " method [" + each + "] found in " +
bean.getClass().getCanonicalName(), ex);
}
}
}
+
+ private Object getTargetBean(Object proxy) throws Exception {
+if(!AopUtils.isAopProxy(proxy)) {
+ return proxy;
+}
+
+if(AopUtils.isJdkDynamicProxy(proxy)) {
+ return