You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by me...@apache.org on 2020/07/02 09:08:33 UTC
[dubbo] branch 2.7.8-dev updated: 2.7.8 release (#6407)
This is an automated email from the ASF dual-hosted git repository.
mercyblitz pushed a commit to branch 2.7.8-dev
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/2.7.8-dev by this push:
new 173df9a 2.7.8 release (#6407)
173df9a is described below
commit 173df9a471b08ff0dacd6405c684b751740eeb21
Author: Mercy Ma <me...@gmail.com>
AuthorDate: Thu Jul 2 17:08:14 2020 +0800
2.7.8 release (#6407)
* Polish apache/dubbo#6296 : Adding the new methods into MetadataReport to manipulate the exported URLs for service introspection
* Polish apache/dubbo#6296 : Adding the new methods into MetadataReport to manipulate the exported URLs for service introspection
* Polish apache/dubbo#6171 : [Feature] Introducing the composite implementation of MetadataService
* Revert "fix wrong check of InvokerListener when export a service (fix issue_6269) (#6271)"
This reverts commit 91989cae508f8482f31ac335879da4a5975661c8.
* Revert "fix wrong check of InvokerListener when export a service (fix issue_6269) (#6271)"
This reverts commit 91989cae508f8482f31ac335879da4a5975661c8.
* Revert the MetadataReport
* Polish apache/dubbo#6305 : [Refactor] ServiceConfig and ReferenceConfig publish the ServiceDefinition based on the Dubbo Event
* Polish apache/dubbo#6198 : [Issue] Fixing NacosDynamicConfiguration#publishConfig bug
* Polish apache/dubbo#6310 : Refactoring MetadataReport's methods
* Polish apache/dubbo#6198 : [Issue] Fixing NacosDynamicConfiguration#publishConfig bug
* Polish apache/dubbo#6198 : [Issue] Fixing NacosDynamicConfiguration#publishConfig bug
* Polish apache/dubbo#6315 : [Refactor] Refactoring the implementation of MetadataReport based on The Config-Center infrastructure
Deprecated List :
- NacosMetadataReport
- ZookeeperMetadataReport
* Polish apache/dubbo#6315 : Refactoring by TreePathDynamicConfiguration
* Polish apache/dubbo#6315 : Refactoring ConsulDynamicConfiguration by TreePathDynamicConfiguration
* Polish apache/dubbo#6315 : Reset the config base path to be "metadata" for ConfigCenterBasedMetadataReportFactory
* Polish apache/dubbo#6315 : Bugfix
* Polish apache/dubbo#6315 : Bugfix
* Polish apache/dubbo#6315 : Correct words
* sync wait netty server to finish shutdown (#6281)
* Polish apache/dubbo#6333 : [Refactor] Using mandatory implementation of Service Instance registration instead of the event
* maybe we can remove null judge in this case (#6321)
* update
* update
* Polish apache/dubbo#6336 : [Refactor] org.apache.dubbo.metadata.ServiceNameMapping
* Polish apache/dubbo#6170 : [Feature] Introducing the externalized configuration for ServiceNameMapping
* Polish apache/dubbo#6342 : [Enhancement] Introducing the composite ServiceNameMapping
* Refactor
* fix method name typo in JValidator.java (#6344)
* [Dubbo-6340]fix application cannot exit when use consul registry (#6341)
* fix application cannot exit when use consul registry
* make consul registry suppor ACL (#6313)
* make consul registry suppor ACL
* Polish apache/dubbo#6172 : [Feature] Adding the "services" attribute methods into @DubboReference
* Polish apache/dubbo#6173 : [Feature] Adding the "services" attribute into <dubbo:reference> element
* Polish apache/dubbo#6346 : [Issue] Merging all subscribied URLs from the multiple services
* Polish apache/dubbo#6346 : [Issue] Merging all subscribied URLs from the multiple services
* fix publish null value when use consul config center (#6351)
* fix publish null value when use consul config center
* Polish apache/dubbo#6252
* Polish apache/dubbo#6356 & apache/dubbo#6171
* Polish apache/dubbo#6356 & apache/dubbo#6171
* Polish apache/dubbo#6224 : Filter chain was not invoked with local calls since v2.7.6
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : Adding META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter
* fix the priority of ListenableRouter were not effective (#6148)
fixes #4822
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* when the url is generic, the log level should be info (#6363)
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* fix NPE when check=false is set and provider is empty. (#6376)
fixes #6228
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* fix #6306. support TypeBuilder sort (#6365)
* fix #6306. support TypeBuilder sort
* fix #6306. support TypeBuilder sort
* fix #6306. support TypeBuilder sort
* remove unused import
* add license for test file
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* enhance ClusterInvoker & ExtensionLoader (#6343)
- Introduce ClusterInvoker to better support multiple registries subscription
- Wrapper sort and enable/disable
- some small fixes
* Polish apache/dubbo#6322 : [Enhancement] Fix the issues of test-cases after refactoring
* Fixed the test-cases
* Enhancement, support Map auto recognize in PojoUtils (#6106)
Fix #5939
* Polish apache/dubbo#6389 : [Issue] Resolving the issues with ConsulServiceDiscovery
* fix typo in CommonConstants (#6373)
* Fix export provider error, change to catch throwable, handle NoClassDefFoundError (#6380)
* check parameterTypesDesc of Generic and Echo (#6374)
* add tps filter to SPI list (#6282)
* Do not clear all configurator instances when override is empty (#6395)
* Service callback throws "Not found exported service" when 'bind.port' is set (#6223)
* Removing RpcContext after test finishes. (#6314)
* Introduce ClusterInvoker to better support multiple registries subscription (#6343)
* return same reference invokers as much as possible (#6083)
fixes #6082
* fix ut
* Fixes the test-cases
* Fixes the test-cases
* Fixes the test-cases
Co-authored-by: tswstarplanet <ts...@apache.org>
Co-authored-by: Nine <ni...@gmail.com>
Co-authored-by: 陈哈哈 <ch...@outlook.com>
Co-authored-by: luoning810 <18...@163.com>
Co-authored-by: cvictory <sh...@gmail.com>
Co-authored-by: ken.lj <ke...@gmail.com>
Co-authored-by: Siqu Chen <32...@users.noreply.github.com>
Co-authored-by: D-H-T <dh...@126.com>
Co-authored-by: skyguard1 <qh...@qq.com>
Co-authored-by: Jeff Lu <27...@qq.com>
Co-authored-by: Christophe·liwei <24...@qq.com>
Co-authored-by: Joe Zou <jo...@apache.org>
Co-authored-by: 李黄河 <ja...@gmail.com>
Co-authored-by: OrDTesters <44...@users.noreply.github.com>
Co-authored-by: zjseu2009 <zj...@163.com>
---
.../org/apache/dubbo/rpc/cluster/Configurator.java | 5 ++-
.../dubbo/rpc/cluster/router/tag/TagRouter.java | 12 ++++++++
.../support/registry/ZoneAwareClusterInvoker.java | 2 +-
.../dubbo/common/constants/CommonConstants.java | 7 +++--
.../org/apache/dubbo/common/utils/PojoUtils.java | 36 +++++++++++++++++++++-
.../apache/dubbo/config/MetadataReportConfig.java | 4 +--
.../apache/dubbo/common/utils/PojoUtilsTest.java | 36 ++++++++++++++++++++++
.../dubbo/config/utils/ConfigValidationUtils.java | 7 +++--
.../apache/dubbo/config/ReferenceConfigTest.java | 5 +--
.../config/url/ExporterSideConfigUrlTest.java | 5 +--
.../dubbo/qos/legacy/InvokerTelnetHandlerTest.java | 14 +++++++++
.../dubbo/qos/legacy/service/DemoService.java | 2 ++
.../dubbo/qos/legacy/service/DemoServiceImpl.java | 5 +++
.../consul/ConsulServiceDiscoveryTest.java | 16 +++++-----
.../registry/dubbo/RegistryDirectoryTest.java | 2 +-
.../main/java/org/apache/dubbo/rpc/Constants.java | 1 +
.../org/apache/dubbo/rpc/filter/ContextFilter.java | 4 +--
.../apache/dubbo/rpc/filter/GenericImplFilter.java | 3 +-
.../org/apache/dubbo/rpc/support/RpcUtils.java | 16 ++++++----
.../dubbo/internal/org.apache.dubbo.rpc.Filter | 3 +-
.../java/org/apache/dubbo/rpc/RpcContextTest.java | 3 +-
.../rpc/protocol/dubbo/CallbackServiceCodec.java | 3 ++
.../protocol/dubbo/DecodeableRpcInvocation.java | 2 +-
.../dubbo/rpc/protocol/dubbo/DubboInvoker.java | 6 ++--
.../rpc/protocol/dubbo/ArgumentCallbackTest.java | 22 +++++++++++++
25 files changed, 179 insertions(+), 42 deletions(-)
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java
index 24e5683..2a69f6e 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java
@@ -27,9 +27,9 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
-import static org.apache.dubbo.rpc.cluster.Constants.PRIORITY_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;
import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;
+import static org.apache.dubbo.rpc.cluster.Constants.PRIORITY_KEY;
/**
* Configurator. (SPI, Prototype, ThreadSafe)
@@ -86,8 +86,7 @@ public interface Configurator extends Comparable<Configurator> {
Map<String, String> override = new HashMap<>(url.getParameters());
//The anyhost parameter of override may be added automatically, it can't change the judgement of changing url
override.remove(ANYHOST_KEY);
- if (override.size() == 0) {
- configurators.clear();
+ if (CollectionUtils.isEmptyMap(override)) {
continue;
}
configurators.add(configuratorFactory.getConfigurator(url));
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
index eb11120..77429b5 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
@@ -193,6 +193,18 @@ public class TagRouter extends AbstractRouter implements ConfigurationListener {
}
private <T> List<Invoker<T>> filterInvoker(List<Invoker<T>> invokers, Predicate<Invoker<T>> predicate) {
+ boolean filter = false;
+ for (int i = 0; i < invokers.size(); ++i) {
+ Invoker<T> invoker = invokers.get(i);
+ if (!predicate.test(invoker)) {
+ filter = true;
+ break;
+ }
+ }
+ if (!filter) {
+ return invokers;
+ }
+
return invokers.stream()
.filter(predicate)
.collect(Collectors.toList());
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/registry/ZoneAwareClusterInvoker.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/registry/ZoneAwareClusterInvoker.java
index 5585b35..f5043e3 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/registry/ZoneAwareClusterInvoker.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/registry/ZoneAwareClusterInvoker.java
@@ -40,7 +40,7 @@ import static org.apache.dubbo.common.constants.RegistryConstants.ZONE_KEY;
/**
* When there're more than one registry for subscription.
- *
+ * <p>
* This extension provides a strategy to decide how to distribute traffics among them:
* 1. registry marked as 'preferred=true' has the highest priority.
* 2. check the zone the current request belongs, pick the registry that has the same zone first.
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
index 1dcbb67..657c1ab 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
@@ -118,7 +118,7 @@ public interface CommonConstants {
// used by invocation attachments to transfer timeout from Consumer to Provider.
// works as a replacement of TIMEOUT_KEY on wire, which seems to be totally useless in previous releases).
- String TIMEOUT_ATTACHENT_KEY = "_TO";
+ String TIMEOUT_ATTACHMENT_KEY = "_TO";
String TIME_COUNTDOWN_KEY = "timeout-countdown";
@@ -126,13 +126,13 @@ public interface CommonConstants {
String REMOVE_VALUE_PREFIX = "-";
- String PROPERTIES_CHAR_SEPERATOR = "-";
+ String PROPERTIES_CHAR_SEPARATOR = "-";
String UNDERLINE_SEPARATOR = "_";
String SEPARATOR_REGEX = "_|-";
- String GROUP_CHAR_SEPERATOR = ":";
+ String GROUP_CHAR_SEPARATOR = ":";
String HIDE_KEY_PREFIX = ".";
@@ -211,6 +211,7 @@ public interface CommonConstants {
*/
String $INVOKE = "$invoke";
String $INVOKE_ASYNC = "$invokeAsync";
+ String GENERIC_PARAMETER_DESC = "Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;";
/**
* package version in the manifest
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java
index c46fcbc..84e2a11 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java
@@ -417,7 +417,19 @@ public class PojoUtils {
}
if (Map.class.isAssignableFrom(type) || type == Object.class) {
- final Map<Object, Object> result = createMap(map);
+ final Map<Object, Object> result;
+ // fix issue#5939
+ Type mapKeyType = getKeyTypeForMap(map.getClass());
+ Type typeKeyType = getGenericClassByIndex(genericType, 0);
+ boolean typeMismatch = mapKeyType instanceof Class
+ && typeKeyType instanceof Class
+ && !typeKeyType.getTypeName().equals(mapKeyType.getTypeName());
+ if (typeMismatch) {
+ result = createMap(new HashMap(0));
+ } else {
+ result = createMap(map);
+ }
+
history.put(pojo, result);
for (Map.Entry<Object, Object> entry : map.entrySet()) {
Type keyType = getGenericClassByIndex(genericType, 0);
@@ -504,6 +516,28 @@ public class PojoUtils {
}
/**
+ * Get key type for {@link Map} directly implemented by {@code clazz}.
+ * If {@code clazz} does not implement {@link Map} directly, return {@code null}.
+ *
+ * @param clazz {@link Class}
+ * @return Return String.class for {@link com.alibaba.fastjson.JSONObject}
+ */
+ private static Type getKeyTypeForMap(Class<?> clazz) {
+ Type[] interfaces = clazz.getGenericInterfaces();
+ if (!ArrayUtils.isEmpty(interfaces)) {
+ for (Type type : interfaces) {
+ if (type instanceof ParameterizedType) {
+ ParameterizedType t = (ParameterizedType)type;
+ if ("java.util.Map".equals(t.getRawType().getTypeName())) {
+ return t.getActualTypeArguments()[0];
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
* Get parameterized type
*
* @param genericType generic type
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
index 0abda27..175288c 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
@@ -24,7 +24,7 @@ import java.util.HashMap;
import java.util.Map;
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;
-import static org.apache.dubbo.common.constants.CommonConstants.PROPERTIES_CHAR_SEPERATOR;
+import static org.apache.dubbo.common.constants.CommonConstants.PROPERTIES_CHAR_SEPARATOR;
/**
* MetadataReportConfig
@@ -38,7 +38,7 @@ public class MetadataReportConfig extends AbstractConfig {
* the value is : metadata-report
*/
private static final String PREFIX_TAG = StringUtils.camelToSplitName(
- MetadataReportConfig.class.getSimpleName().substring(0, MetadataReportConfig.class.getSimpleName().length() - 6), PROPERTIES_CHAR_SEPERATOR);
+ MetadataReportConfig.class.getSimpleName().substring(0, MetadataReportConfig.class.getSimpleName().length() - 6), PROPERTIES_CHAR_SEPARATOR);
// Register center address
private String address;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java
index e05c09d..24cb292 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.common.model.person.PersonInfo;
import org.apache.dubbo.common.model.person.PersonStatus;
import org.apache.dubbo.common.model.person.Phone;
+import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -280,6 +281,41 @@ public class PojoUtilsTest {
}
@Test
+ public void testJsonObjectToMap() throws Exception {
+ Method method = PojoUtilsTest.class.getMethod("setMap", Map.class);
+ assertNotNull(method);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("1", "test");
+ @SuppressWarnings("unchecked")
+ Map<Integer, Object> value = (Map<Integer, Object>)PojoUtils.realize(jsonObject,
+ method.getParameterTypes()[0],
+ method.getGenericParameterTypes()[0]);
+ method.invoke(new PojoUtilsTest(), value);
+ assertEquals("test", value.get(1));
+ }
+
+ @Test
+ public void testListJsonObjectToListMap() throws Exception {
+ Method method = PojoUtilsTest.class.getMethod("setListMap", List.class);
+ assertNotNull(method);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("1", "test");
+ List<JSONObject> list = new ArrayList<>(1);
+ list.add(jsonObject);
+ @SuppressWarnings("unchecked")
+ List<Map<Integer, Object>> result = (List<Map<Integer, Object>>)PojoUtils.realize(
+ list,
+ method.getParameterTypes()[0],
+ method.getGenericParameterTypes()[0]);
+ method.invoke(new PojoUtilsTest(), result);
+ assertEquals("test", result.get(0).get(1));
+ }
+
+ public void setMap(Map<Integer, Object> map) {}
+
+ public void setListMap(List<Map<Integer, Object>> list) {}
+
+ @Test
public void testException() throws Exception {
Map map = new HashMap();
map.put("message", "dubbo exception");
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
index 2e46fa2..8a91d1c 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
@@ -223,10 +223,12 @@ public class ConfigValidationUtils {
ApplicationConfig application = interfaceConfig.getApplication();
AbstractConfig.appendParameters(map, monitor);
AbstractConfig.appendParameters(map, application);
- String address = monitor.getAddress();
+ String address = null;
String sysaddress = System.getProperty("dubbo.monitor.address");
if (sysaddress != null && sysaddress.length() > 0) {
address = sysaddress;
+ } else if (monitor != null) {
+ address = monitor.getAddress();
}
if (ConfigUtils.isNotEmpty(address)) {
if (!map.containsKey(PROTOCOL_KEY)) {
@@ -237,7 +239,8 @@ public class ConfigValidationUtils {
}
}
return UrlUtils.parseURL(address, map);
- } else if ((REGISTRY_PROTOCOL.equals(monitor.getProtocol()) || SERVICE_REGISTRY_PROTOCOL.equals(monitor.getProtocol()))
+ } else if (monitor != null &&
+ (REGISTRY_PROTOCOL.equals(monitor.getProtocol()) || SERVICE_REGISTRY_PROTOCOL.equals(monitor.getProtocol()))
&& registryURL != null) {
return URLBuilder.from(registryURL)
.setProtocol(DUBBO_PROTOCOL)
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index c992e48..775596c 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.api.DemoService;
import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
+import org.apache.dubbo.rpc.model.ApplicationModel;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
@@ -33,12 +34,12 @@ public class ReferenceConfigTest {
@BeforeEach
public void setUp() {
-// ApplicationModel.getConfigManager().clear();
+ ApplicationModel.reset();
}
@AfterEach
public void tearDown() {
-// ApplicationModel.getConfigManager().clear();
+ ApplicationModel.reset();
}
@Test
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/ExporterSideConfigUrlTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/ExporterSideConfigUrlTest.java
index e1fbfb4..5c19d04 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/ExporterSideConfigUrlTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/url/ExporterSideConfigUrlTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config.url;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.rpc.model.ApplicationModel;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
@@ -42,13 +43,13 @@ public class ExporterSideConfigUrlTest extends UrlTestBase {
@BeforeEach
public void setUp() {
+ ApplicationModel.reset();
initServConf();
-// ApplicationModel.getConfigManager().clear();
}
@AfterEach()
public void teardown() {
-// ApplicationModel.getConfigManager().clear();
+ ApplicationModel.reset();
}
@Test
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/InvokerTelnetHandlerTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/InvokerTelnetHandlerTest.java
index fd0f2b2..d8bcd0c 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/InvokerTelnetHandlerTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/InvokerTelnetHandlerTest.java
@@ -155,6 +155,20 @@ public class InvokerTelnetHandlerTest {
}
@Test
+ public void testInvokeMethodWithMapParameter() throws RemotingException {
+ mockChannel = mock(Channel.class);
+ given(mockChannel.getAttribute("telnet.service")).willReturn(DemoService.class.getName());
+ given(mockChannel.getLocalAddress()).willReturn(NetUtils.toAddress("127.0.0.1:5555"));
+ given(mockChannel.getRemoteAddress()).willReturn(NetUtils.toAddress("127.0.0.1:20886"));
+
+ registerProvider(DemoService.class.getName(), new DemoServiceImpl(), DemoService.class);
+
+ String param = "{1:\"Dubbo\",2:\"test\"}";
+ String result = invoke.telnet(mockChannel, "getMap(" + param + ")");
+ assertTrue(result.contains("result: {1:\"Dubbo\",2:\"test\"}"));
+ }
+
+ @Test
public void testInvokeMultiJsonParamMethod() throws RemotingException {
mockChannel = mock(Channel.class);
given(mockChannel.getAttribute("telnet.service")).willReturn(null);
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoService.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoService.java
index c862f08..8ffa550 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoService.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoService.java
@@ -66,4 +66,6 @@ public interface DemoService {
String getPerson(Man man);
String getRemoteApplicationName();
+
+ Map<Integer, Object> getMap(Map<Integer, Object> map);
}
\ No newline at end of file
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoServiceImpl.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoServiceImpl.java
index dcefeff..675aeba 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoServiceImpl.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/legacy/service/DemoServiceImpl.java
@@ -126,4 +126,9 @@ public class DemoServiceImpl implements DemoService {
public String getRemoteApplicationName() {
return RpcContext.getContext().getRemoteApplicationName();
}
+
+ @Override
+ public Map<Integer, Object> getMap(Map<Integer, Object> map) {
+ return map;
+ }
}
\ No newline at end of file
diff --git a/dubbo-registry/dubbo-registry-consul/src/test/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryTest.java b/dubbo-registry/dubbo-registry-consul/src/test/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryTest.java
index e106248..9f10d0a 100644
--- a/dubbo-registry/dubbo-registry-consul/src/test/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryTest.java
+++ b/dubbo-registry/dubbo-registry-consul/src/test/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryTest.java
@@ -16,12 +16,13 @@
*/
package org.apache.dubbo.registry.consul;
-import com.pszymczyk.consul.ConsulProcess;
-import com.pszymczyk.consul.ConsulStarterBuilder;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.registry.client.DefaultServiceInstance;
import org.apache.dubbo.registry.client.ServiceInstance;
+
+import com.pszymczyk.consul.ConsulProcess;
+import com.pszymczyk.consul.ConsulStarterBuilder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
@@ -36,9 +37,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public class ConsulServiceDiscoveryTest {
- private static ConsulProcess consul;
private URL url;
- static ConsulServiceDiscovery consulServiceDiscovery;
+ private ConsulServiceDiscovery consulServiceDiscovery;
+ private ConsulProcess consul;
private static final String SERVICE_NAME = "A";
private static final String LOCALHOST = "127.0.0.1";
@@ -49,7 +50,6 @@ public class ConsulServiceDiscoveryTest {
.start();
url = URL.valueOf("consul://localhost:" + consul.getHttpPort());
consulServiceDiscovery = new ConsulServiceDiscovery();
- Assertions.assertNull(consulServiceDiscovery.getServices());
consulServiceDiscovery.initialize(url);
}
@@ -60,7 +60,7 @@ public class ConsulServiceDiscoveryTest {
}
@Test
- public void testRegistration() throws InterruptedException{
+ public void testRegistration() throws InterruptedException {
DefaultServiceInstance serviceInstance = createServiceInstance(SERVICE_NAME, LOCALHOST, NetUtils.getAvailablePort());
consulServiceDiscovery.register(serviceInstance);
Thread.sleep(5000);
@@ -94,8 +94,8 @@ public class ConsulServiceDiscoveryTest {
Thread.sleep(5000);
Assertions.assertFalse(consulServiceDiscovery.getInstances(serviceName).isEmpty());
List<String> r = convertToIpPort(consulServiceDiscovery.getInstances(serviceName));
- assertTrue(r.contains("127.0.0.1:"+portA));
- assertTrue(r.contains("127.0.0.1:"+portB));
+ assertTrue(r.contains("127.0.0.1:" + portA));
+ assertTrue(r.contains("127.0.0.1:" + portB));
}
private List<String> convertToIpPort(List<ServiceInstance> serviceInstances) {
diff --git a/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryDirectoryTest.java b/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryDirectoryTest.java
index 9ce163c..c38a7f2 100644
--- a/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryDirectoryTest.java
+++ b/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryDirectoryTest.java
@@ -768,7 +768,7 @@ public class RegistryDirectoryTest {
List<Invoker<?>> invokers = registryDirectory.list(invocation);
Invoker<?> aInvoker = invokers.get(0);
//Need to be restored to the original providerUrl
- Assertions.assertEquals("1", aInvoker.getUrl().getParameter("timeout"));
+ Assertions.assertEquals("3", aInvoker.getUrl().getParameter("timeout"));
}
/**
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java
index b7698e8..f5fd982 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java
@@ -27,6 +27,7 @@ public interface Constants {
String DEPRECATED_KEY = "deprecated";
String $ECHO = "$echo";
+ String $ECHO_PARAMETER_DESC = "Ljava/lang/Object;";
String RETURN_PREFIX = "return ";
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ContextFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ContextFilter.java
index 81ad8df..291601a 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ContextFilter.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ContextFilter.java
@@ -40,7 +40,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;
import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_APPLICATION_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_ATTACHENT_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_ATTACHMENT_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.TIME_COUNTDOWN_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
@@ -71,7 +71,7 @@ public class ContextFilter implements Filter, Filter.Listener {
UNLOADING_KEYS.add(DUBBO_VERSION_KEY);
UNLOADING_KEYS.add(TOKEN_KEY);
UNLOADING_KEYS.add(TIMEOUT_KEY);
- UNLOADING_KEYS.add(TIMEOUT_ATTACHENT_KEY);
+ UNLOADING_KEYS.add(TIMEOUT_ATTACHMENT_KEY);
// Remove async property to avoid being passed to the following invoke chain.
UNLOADING_KEYS.add(ASYNC_KEY);
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java
index 194a98b..20ef2ce 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericImplFilter.java
@@ -43,6 +43,7 @@ import java.lang.reflect.Type;
import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;
import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE_ASYNC;
+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_PARAMETER_DESC;
import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;
/**
@@ -55,8 +56,6 @@ public class GenericImplFilter implements Filter, Filter.Listener {
private static final Class<?>[] GENERIC_PARAMETER_TYPES = new Class<?>[]{String.class, String[].class, Object[].class};
- private static final String GENERIC_PARAMETER_DESC = "Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;";
-
private static final String GENERIC_IMPL_MARKER = "GENERIC_IMPL";
@Override
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java
index 18f9f68..3e8f81e 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java
@@ -34,9 +34,11 @@ import java.util.concurrent.atomic.AtomicLong;
import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE;
import static org.apache.dubbo.common.constants.CommonConstants.$INVOKE_ASYNC;
-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_ATTACHENT_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_PARAMETER_DESC;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_ATTACHMENT_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
import static org.apache.dubbo.rpc.Constants.$ECHO;
+import static org.apache.dubbo.rpc.Constants.$ECHO_PARAMETER_DESC;
import static org.apache.dubbo.rpc.Constants.ASYNC_KEY;
import static org.apache.dubbo.rpc.Constants.AUTO_ATTACH_INVOCATIONID_KEY;
import static org.apache.dubbo.rpc.Constants.ID_KEY;
@@ -176,12 +178,14 @@ public class RpcUtils {
return $INVOKE_ASYNC.equals(inv.getMethodName());
}
- public static boolean isGenericCall(String path, String method) {
- return $INVOKE.equals(method) || $INVOKE_ASYNC.equals(method);
+ // check parameterTypesDesc to fix CVE-2020-1948
+ public static boolean isGenericCall(String parameterTypesDesc, String method) {
+ return ($INVOKE.equals(method) || $INVOKE_ASYNC.equals(method)) && GENERIC_PARAMETER_DESC.equals(parameterTypesDesc);
}
- public static boolean isEcho(String path, String method) {
- return $ECHO.equals(method);
+ // check parameterTypesDesc to fix CVE-2020-1948
+ public static boolean isEcho(String parameterTypesDesc, String method) {
+ return $ECHO.equals(method) && $ECHO_PARAMETER_DESC.equals(parameterTypesDesc);
}
public static InvokeMode getInvokeMode(URL url, Invocation inv) {
@@ -217,7 +221,7 @@ public class RpcUtils {
public static long getTimeout(Invocation invocation, long defaultTimeout) {
long timeout = defaultTimeout;
- Object genericTimeout = invocation.getObjectAttachment(TIMEOUT_ATTACHENT_KEY);
+ Object genericTimeout = invocation.getObjectAttachment(TIMEOUT_ATTACHMENT_KEY);
if (genericTimeout != null) {
timeout = convertToNumber(genericTimeout, defaultTimeout);
}
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter b/dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
index 376f966..3d6da08 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
@@ -11,4 +11,5 @@ exception=org.apache.dubbo.rpc.filter.ExceptionFilter
executelimit=org.apache.dubbo.rpc.filter.ExecuteLimitFilter
deprecated=org.apache.dubbo.rpc.filter.DeprecatedFilter
compatible=org.apache.dubbo.rpc.filter.CompatibleFilter
-timeout=org.apache.dubbo.rpc.filter.TimeoutFilter
\ No newline at end of file
+timeout=org.apache.dubbo.rpc.filter.TimeoutFilter
+tps=org.apache.dubbo.rpc.filter.TpsLimitFilter
\ No newline at end of file
diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java
index 7e7e1df..380b2c3 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/RpcContextTest.java
@@ -25,8 +25,6 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
public class RpcContextTest {
@@ -157,6 +155,7 @@ public class RpcContextTest {
rpcContext.stopAsync();
Assertions.assertTrue(rpcContext.isAsyncStarted());
+ RpcContext.removeContext();
}
@Test
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
index 7a60e0e..eead37c 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
@@ -24,6 +24,7 @@ import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.ConcurrentHashSet;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.remoting.Channel;
+import org.apache.dubbo.remoting.Constants;
import org.apache.dubbo.remoting.RemotingException;
import org.apache.dubbo.rpc.Exporter;
import org.apache.dubbo.rpc.Invocation;
@@ -113,7 +114,9 @@ class CallbackServiceCodec {
}
}
tmpMap.putAll(params);
+
tmpMap.remove(VERSION_KEY);// doesn't need to distinguish version for callback
+ tmpMap.remove(Constants.BIND_PORT_KEY); //callback doesn't needs bind.port
tmpMap.put(INTERFACE_KEY, clazz.getName());
URL exportUrl = new URL(DubboProtocol.NAME, channel.getLocalAddress().getAddress().getHostAddress(), channel.getLocalAddress().getPort(), clazz.getName() + "." + instid, tmpMap);
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java
index c5f6a0a..f286ddb 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java
@@ -130,7 +130,7 @@ public class DecodeableRpcInvocation extends RpcInvocation implements Codec, Dec
}
}
if (pts == DubboCodec.EMPTY_CLASS_ARRAY) {
- if (!RpcUtils.isGenericCall(path, getMethodName()) && !RpcUtils.isEcho(path, getMethodName())) {
+ if (!RpcUtils.isGenericCall(desc, getMethodName()) && !RpcUtils.isEcho(desc, getMethodName())) {
throw new IllegalArgumentException("Service not found:" + path + ", " + getMethodName());
}
pts = ReflectUtils.desc2classArray(desc);
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
index d88ae54..c415ac4 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
@@ -47,7 +47,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.ENABLE_TIMEOUT_C
import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_ATTACHENT_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_ATTACHMENT_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.TIME_COUNTDOWN_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;
@@ -168,12 +168,12 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
if (countdown == null) {
timeout = (int) RpcUtils.getTimeout(getUrl(), methodName, RpcContext.getContext(), DEFAULT_TIMEOUT);
if (getUrl().getParameter(ENABLE_TIMEOUT_COUNTDOWN_KEY, false)) {
- invocation.setObjectAttachment(TIMEOUT_ATTACHENT_KEY, timeout); // pass timeout to remote server
+ invocation.setObjectAttachment(TIMEOUT_ATTACHMENT_KEY, timeout); // pass timeout to remote server
}
} else {
TimeoutCountDown timeoutCountDown = (TimeoutCountDown) countdown;
timeout = (int) timeoutCountDown.timeRemaining(TimeUnit.MILLISECONDS);
- invocation.setObjectAttachment(TIMEOUT_ATTACHENT_KEY, timeout);// pass timeout to remote server
+ invocation.setObjectAttachment(TIMEOUT_ATTACHMENT_KEY, timeout);// pass timeout to remote server
}
return timeout;
}
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java
index a51244a..4bc0800 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.protocol.dubbo;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.remoting.Constants;
import org.apache.dubbo.rpc.Exporter;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcException;
@@ -104,6 +105,27 @@ public class ArgumentCallbackTest {
} catch (Exception e) {
}
}
+
+ @Test
+ public void TestCallbackNormalWithBindPort() throws Exception {
+ initOrResetUrl(1, 10000000);
+ consumerUrl = serviceURL.addParameter(Constants.BIND_PORT_KEY,"7653");
+ initOrResetService();
+
+ final AtomicInteger count = new AtomicInteger(0);
+
+ demoProxy.xxx(new IDemoCallback() {
+ public String yyy(String msg) {
+ System.out.println("Recived callback: " + msg);
+ count.incrementAndGet();
+ return "ok";
+ }
+ }, "other custom args", 10, 100);
+ System.out.println("Async...");
+ assertCallbackCount(10, 100, count);
+ destroyService();
+
+ }
@Test
public void TestCallbackNormal() throws Exception {