You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/06/24 08:02:45 UTC
[dubbo] branch master updated: Tests transaction of callback method
#8098 (#8120)
This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/master by this push:
new fd4ae9b Tests transaction of callback method #8098 (#8120)
fd4ae9b is described below
commit fd4ae9bebfe3020c7756dcc6e2c3a2012079f363
Author: Gong Dewei <ky...@qq.com>
AuthorDate: Thu Jun 24 16:02:17 2021 +0800
Tests transaction of callback method #8098 (#8120)
---
.../dubbo/config/spring/api/MethodCallback.java | 62 ++++----
.../annotation/MethodConfigCallbackTest.java | 42 +++---
.../annotation/provider/ProviderConfiguration.java | 27 +++-
.../config/spring/impl/MethodCallbackImpl.java | 162 ++++++++++++++-------
4 files changed, 185 insertions(+), 108 deletions(-)
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/api/MethodCallback.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/api/MethodCallback.java
index 770734f..1eafa3b 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/api/MethodCallback.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/api/MethodCallback.java
@@ -1,31 +1,31 @@
-/*
- * 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.dubbo.config.spring.api;
-
-public interface MethodCallback {
- void oninvoke(String request);
-
- void onreturn(String response, String request);
-
- void onthrow(Throwable ex, String request);
-
- String getOnInvoke();
-
- String getOnReturn();
-
- String getOnThrow();
-}
+/*
+ * 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.dubbo.config.spring.api;
+
+public interface MethodCallback {
+ void oninvoke(String request);
+
+ void onreturn(String response, String request);
+
+ void onthrow(Throwable ex, String request);
+
+ String getOnInvoke();
+
+ String getOnReturn();
+
+ String getOnThrow();
+}
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java
index 30e6137..695d07f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java
@@ -21,54 +21,50 @@ import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.config.spring.api.HelloService;
import org.apache.dubbo.config.spring.api.MethodCallback;
+import org.apache.dubbo.config.spring.context.annotation.provider.ProviderConfiguration;
import org.apache.dubbo.config.spring.impl.MethodCallbackImpl;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.event.annotation.AfterTestMethod;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(
classes = {
- ServiceAnnotationTestConfiguration.class,
+ ProviderConfiguration.class,
MethodConfigCallbackTest.class,
+ MethodConfigCallbackTest.MethodCallbackConfiguration.class
})
@TestPropertySource(properties = {
- "packagesToScan = org.apache.dubbo.config.spring.context.annotation.provider",
- "consumer.version = ${demo.service.version}",
- "consumer.url = dubbo://127.0.0.1:12345?version=2.5.7",
+ "dubbo.protocols.dubbo.port=-1",
+ //"dubbo.registries.my-registry.address=zookeeper://127.0.0.1:2181"
})
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class MethodConfigCallbackTest {
- @AfterTestMethod
- public void setUp() {
+ @BeforeAll
+ public static void setUp() {
DubboBootstrap.reset();
}
- @Bean("referenceAnnotationBeanPostProcessor")
- public ReferenceAnnotationBeanPostProcessor referenceAnnotationBeanPostProcessor() {
- return new ReferenceAnnotationBeanPostProcessor();
- }
-
@Autowired
private ConfigurableApplicationContext context;
- @Bean("methodCallback")
- public MethodCallback methodCallback() {
- return new MethodCallbackImpl();
- }
-
- @DubboReference(check = false,methods = {@Method(name = "sayHello",oninvoke = "methodCallback.oninvoke",onreturn = "methodCallback.onreturn",onthrow = "methodCallback.onthrow")})
+ @DubboReference(check = false,
+ methods = {@Method(name = "sayHello",
+ oninvoke = "methodCallback.oninvoke",
+ onreturn = "methodCallback.onreturn",
+ onthrow = "methodCallback.onthrow")})
private HelloService helloServiceMethodCallBack;
@Test
@@ -78,4 +74,14 @@ public class MethodConfigCallbackTest {
Assertions.assertEquals("dubbo invoke success", notify.getOnInvoke());
Assertions.assertEquals("dubbo return success", notify.getOnReturn());
}
+
+ @Configuration
+ static class MethodCallbackConfiguration {
+
+ @Bean("methodCallback")
+ public MethodCallback methodCallback() {
+ return new MethodCallbackImpl();
+ }
+
+ }
}
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/ProviderConfiguration.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/ProviderConfiguration.java
index 020f5d2..243c25e 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/ProviderConfiguration.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/ProviderConfiguration.java
@@ -21,14 +21,19 @@ import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
-import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.transaction.support.AbstractPlatformTransactionManager;
+import org.springframework.transaction.support.DefaultTransactionStatus;
+
+import java.util.UUID;
@DubboComponentScan(basePackages = "org.apache.dubbo.config.spring.context.annotation.provider")
@PropertySource("classpath:/META-INF/default.properties")
@@ -84,21 +89,29 @@ public class ProviderConfiguration {
@Primary
@Bean
public PlatformTransactionManager platformTransactionManager() {
- return new PlatformTransactionManager() {
+ return new AbstractPlatformTransactionManager() {
+ private Logger logger = LoggerFactory.getLogger("TestPlatformTransactionManager");
@Override
- public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
- return null;
+ protected Object doGetTransaction() throws TransactionException {
+ String transaction = "transaction_" + UUID.randomUUID().toString();
+ logger.info("Create transaction: " + transaction);
+ return transaction;
}
@Override
- public void commit(TransactionStatus status) throws TransactionException {
-
+ protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException {
+ logger.info("Begin transaction: " + transaction);
}
@Override
- public void rollback(TransactionStatus status) throws TransactionException {
+ protected void doCommit(DefaultTransactionStatus status) throws TransactionException {
+ logger.info("Commit transaction: " + status.getTransaction());
+ }
+ @Override
+ protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
+ logger.info("Rollback transaction: " + status.getTransaction());
}
};
}
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java
index 766010d..e457967 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java
@@ -1,52 +1,110 @@
-/*
- * 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.dubbo.config.spring.impl;
-
-import org.apache.dubbo.config.spring.api.MethodCallback;
-
-public class MethodCallbackImpl implements MethodCallback {
- private String onInvoke;
- private String onReturn;
- private String onThrow;
-
- @Override
- public void oninvoke(String request) {
- this.onInvoke = "dubbo invoke success";
- }
-
- @Override
- public void onreturn(String response, String request) {
- this.onReturn = "dubbo return success";
- }
-
- @Override
- public void onthrow(Throwable ex, String request) {
- this.onThrow = "dubbo throw exception";
- }
-
- public String getOnInvoke() {
- return this.onInvoke;
- }
-
- public String getOnReturn() {
- return this.onReturn;
- }
-
- public String getOnThrow() {
- return this.onThrow;
- }
-}
+/*
+ * 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.dubbo.config.spring.impl;
+
+import org.apache.dubbo.config.spring.api.MethodCallback;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.env.Environment;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import javax.annotation.PostConstruct;
+
+public class MethodCallbackImpl implements MethodCallback {
+ private String onInvoke;
+ private String onReturn;
+ private String onThrow;
+
+ @Autowired
+ private Environment environment;
+
+ @Autowired
+ private ApplicationContext context;
+
+ @PostConstruct
+ protected void init() {
+ checkInjection();
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void oninvoke(String request) {
+ try {
+ checkInjection();
+ checkTranscation();
+ this.onInvoke = "dubbo invoke success";
+ } catch (Exception e) {
+ this.onInvoke = e.toString();
+ throw e;
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void onreturn(String response, String request) {
+ try {
+ checkInjection();
+ checkTranscation();
+ this.onReturn = "dubbo return success";
+ } catch (Exception e) {
+ this.onReturn = e.toString();
+ throw e;
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void onthrow(Throwable ex, String request) {
+ try {
+ checkInjection();
+ checkTranscation();
+ this.onThrow = "dubbo throw exception";
+ } catch (Exception e) {
+ this.onThrow = e.toString();
+ throw e;
+ }
+ }
+
+ public String getOnInvoke() {
+ return this.onInvoke;
+ }
+
+ public String getOnReturn() {
+ return this.onReturn;
+ }
+
+ public String getOnThrow() {
+ return this.onThrow;
+ }
+
+ private void checkInjection() {
+ if (environment == null) {
+ throw new IllegalStateException("environment is null");
+ }
+ if (context == null) {
+ throw new IllegalStateException("application context is null");
+ }
+ }
+
+ private void checkTranscation() {
+ if (!TransactionSynchronizationManager.isActualTransactionActive()) {
+ throw new IllegalStateException("No active transaction");
+ }
+ }
+
+}