This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.2 by this push:
new 854d85953d fix #11033 (#11144)
854d85953d is described below
commit 854d85953d6421d19fa3e4bfc288d3f3a154010a
Author: ShenFeng312 <[email protected]>
AuthorDate: Fri Dec 30 16:27:16 2022 +0800
fix #11033 (#11144)
---
.../config/spring/impl/MethodCallbackImpl.java | 27 +++++++-------
.../java/org/apache/dubbo/rpc/RpcInvocation.java | 3 ++
.../org/apache/dubbo/rpc/filter/ContextFilter.java | 5 +--
.../apache/dubbo/rpc/protocol/AbstractInvoker.java | 10 +++++-
.../dubbo/rpc/protocol/AbstractProxyProtocol.java | 42 ++++++++++++++++++++--
.../dubbo/rpc/protocol/dubbo/DubboInvoker.java | 4 ---
.../dubbo/rpc/protocol/rest/RpcContextFilter.java | 11 +++++-
7 files changed, 79 insertions(+), 23 deletions(-)
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 a005471040..a8fe9bc23a 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
@@ -29,6 +29,9 @@ import java.util.concurrent.atomic.AtomicInteger;
public class MethodCallbackImpl implements MethodCallback {
private String onInvoke1 = "";
+
+ private final Object lock = new Object();
+
private String onReturn1 = "";
private String onThrow1 = "";
@@ -55,11 +58,11 @@ public class MethodCallbackImpl implements MethodCallback {
try {
checkInjection();
checkTranscation();
- synchronized (this.onInvoke1) {
+ synchronized (lock) {
this.onInvoke1 += "dubbo invoke success!";
}
} catch (Exception e) {
- synchronized (this.onInvoke1) {
+ synchronized (lock) {
this.onInvoke1 += e.toString();
}
throw e;
@@ -72,11 +75,11 @@ public class MethodCallbackImpl implements MethodCallback {
try {
checkInjection();
checkTranscation();
- synchronized (this.onInvoke2) {
+ synchronized (lock) {
this.onInvoke2 += "dubbo invoke success(2)!";
}
} catch (Exception e) {
- synchronized (this.onInvoke2) {
+ synchronized (lock) {
this.onInvoke2 += e.toString();
}
throw e;
@@ -89,11 +92,11 @@ public class MethodCallbackImpl implements MethodCallback {
try {
checkInjection();
checkTranscation();
- synchronized (this.onReturn1) {
+ synchronized (lock) {
this.onReturn1 += "dubbo return success!";
}
} catch (Exception e) {
- synchronized (this.onReturn1) {
+ synchronized (lock) {
this.onReturn1 += e.toString();
}
throw e;
@@ -108,11 +111,11 @@ public class MethodCallbackImpl implements MethodCallback
{
try {
checkInjection();
checkTranscation();
- synchronized (this.onReturn2) {
+ synchronized (lock) {
this.onReturn2 += "dubbo return success(2)!";
}
} catch (Exception e) {
- synchronized (this.onReturn2) {
+ synchronized (lock) {
this.onReturn2 += e.toString();
}
throw e;
@@ -127,11 +130,11 @@ public class MethodCallbackImpl implements MethodCallback
{
try {
checkInjection();
checkTranscation();
- synchronized (this.onThrow1) {
+ synchronized (lock) {
this.onThrow1 += "dubbo throw exception!";
}
} catch (Exception e) {
- synchronized (this.onThrow1) {
+ synchronized (lock) {
this.onThrow1 += e.toString();
}
throw e;
@@ -144,11 +147,11 @@ public class MethodCallbackImpl implements MethodCallback
{
try {
checkInjection();
checkTranscation();
- synchronized (this.onThrow2) {
+ synchronized (lock) {
this.onThrow2 += "dubbo throw exception(2)!";
}
} catch (Exception e) {
- synchronized (this.onThrow2) {
+ synchronized (lock) {
this.onThrow2 += e.toString();
}
throw e;
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java
index b4aa155890..4ac08dbb1e 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java
@@ -437,6 +437,9 @@ public class RpcInvocation implements Invocation,
Serializable {
public Map<String, String> getAttachments() {
try {
attachmentLock.lock();
+ if (attachments == null) {
+ attachments = new HashMap<>();
+ }
return new AttachmentsAdapter.ObjectToStringMap(attachments);
} finally {
attachmentLock.unlock();
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 487e0238cc..88ef7d6ede 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
@@ -126,7 +126,7 @@ public class ContextFilter implements Filter,
Filter.Listener {
// merged from dubbox
// we may already add some attachments into RpcContext before this
filter (e.g. in rest protocol)
- if (attachments != null) {
+ if (CollectionUtils.isNotEmptyMap(attachments)) {
if (context.getObjectAttachments().size() > 0) {
context.getObjectAttachments().putAll(attachments);
} else {
@@ -135,7 +135,8 @@ public class ContextFilter implements Filter,
Filter.Listener {
}
if (invocation instanceof RpcInvocation) {
- ((RpcInvocation) invocation).setInvoker(invoker);
+ RpcInvocation rpcInvocation = (RpcInvocation) invocation;
+ rpcInvocation.setInvoker(invoker);
}
try {
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java
index c2d7b31699..e9e21902d5 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractInvoker.java
@@ -49,6 +49,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
+import static
org.apache.dubbo.common.constants.CommonConstants.DEFAULT_VERSION;
import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_FAILED_REQUEST;
import static org.apache.dubbo.rpc.Constants.SERIALIZATION_ID_KEY;
@@ -75,6 +76,8 @@ public abstract class AbstractInvoker<T> implements
Invoker<T> {
*/
private final Map<String, Object> attachment;
+ protected final String version;
+
/**
* {@link Node} available
*/
@@ -109,7 +112,12 @@ public abstract class AbstractInvoker<T> implements
Invoker<T> {
}
this.type = type;
this.url = url;
- this.attachment = attachment == null ? null :
Collections.unmodifiableMap(attachment);
+
+ this.attachment = attachment == null
+ ? null
+ : Collections.unmodifiableMap(attachment);
+ this.version = url.getVersion(DEFAULT_VERSION);
+
}
private static Map<String, Object> convertAttachment(URL url, String[]
keys) {
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
index e1727c38ca..9328598081 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.ProtocolServer;
import org.apache.dubbo.rpc.ProxyFactory;
import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.RpcException;
import java.net.InetSocketAddress;
@@ -44,7 +45,12 @@ import java.util.concurrent.CopyOnWriteArrayList;
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
+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.VERSION_KEY;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_UNSUPPORTED;
+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;
/**
* AbstractProxyProtocol
@@ -87,7 +93,35 @@ public abstract class AbstractProxyProtocol extends
AbstractProtocol {
return exporter;
}
}
- final Runnable runnable = doExport(proxyFactory.getProxy(invoker,
true), invoker.getInterface(), invoker.getUrl());
+ final Runnable runnable = doExport(proxyFactory.getProxy(
+ new Invoker<T>() {
+ @Override
+ public Class<T> getInterface() {
+ return invoker.getInterface();
+ }
+
+ @Override
+ public Result invoke(Invocation invocation) throws
RpcException {
+
RpcContext.getServiceContext().getObjectAttachments().forEach(invocation::setObjectAttachment);
+ return invoker.invoke(invocation);
+ }
+
+ @Override
+ public URL getUrl() {
+ return invoker.getUrl();
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return invoker.isAvailable();
+ }
+
+ @Override
+ public void destroy() {
+ invoker.destroy();
+ }
+ }, true), invoker.getInterface(),
+ invoker.getUrl());
exporter = new AbstractExporter<T>(invoker) {
@Override
public void afterUnExport() {
@@ -108,10 +142,12 @@ public abstract class AbstractProxyProtocol extends
AbstractProtocol {
@Override
protected <T> Invoker<T> protocolBindingRefer(final Class<T> type, final
URL url) throws RpcException {
final Invoker<T> target = proxyFactory.getInvoker(doRefer(type, url),
type, url);
- Invoker<T> invoker = new AbstractInvoker<T>(type, url) {
+ Invoker<T> invoker = new AbstractInvoker<T>(type, url, new
String[]{INTERFACE_KEY, GROUP_KEY, TOKEN_KEY}) {
@Override
- protected Result doInvoke(Invocation invocation) throws Throwable {
+ protected Result doInvoke(Invocation invocation) {
try {
+ invocation.setAttachment(PATH_KEY, getUrl().getPath());
+ invocation.setAttachment(VERSION_KEY, version);
Result result = target.invoke(invocation);
// FIXME result is an AsyncRpcResult instance.
Throwable e = result.getException();
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 9be288b14b..d32042d97d 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
@@ -43,7 +43,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import static
org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
-import static
org.apache.dubbo.common.constants.CommonConstants.DEFAULT_VERSION;
import static
org.apache.dubbo.common.constants.CommonConstants.ENABLE_TIMEOUT_COUNTDOWN_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
@@ -64,7 +63,6 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
private final AtomicPositiveInteger index = new AtomicPositiveInteger();
- private final String version;
private final ReentrantLock destroyLock = new ReentrantLock();
@@ -79,8 +77,6 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
public DubboInvoker(Class<T> serviceType, URL url, ExchangeClient[]
clients, Set<Invoker<?>> invokers) {
super(serviceType, url, new String[]{INTERFACE_KEY, GROUP_KEY,
TOKEN_KEY});
this.clients = clients;
- // get version.
- this.version = url.getVersion(DEFAULT_VERSION);
this.invokers = invokers;
this.serverShutdownTimeout =
ConfigurationUtils.getServerShutdownTimeout(getUrl().getScopeModel());
}
diff --git
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java
index 20556ae4e1..70edad5bcc 100644
---
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java
+++
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java
@@ -16,7 +16,9 @@
*/
package org.apache.dubbo.rpc.protocol.rest;
+import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.RpcContext;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
@@ -30,6 +32,7 @@ import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
import java.util.Map;
@Priority(Integer.MIN_VALUE + 1)
@@ -70,7 +73,13 @@ public class RpcContextFilter implements
ContainerRequestFilter, ClientRequestFi
@Override
public void filter(ClientRequestContext requestContext) throws IOException
{
int size = 0;
- for (Map.Entry<String, Object> entry :
RpcContext.getClientAttachment().getObjectAttachments().entrySet()) {
+ Map<String, Object> objectAttachments = new
HashMap<>(RpcContext.getClientAttachment().getObjectAttachments());
+ Invocation invocation = RpcContext.getServiceContext().getInvocation();
+ //should merge attachments from invocation and
RpcContext.getClientAttachment()
+ if(invocation != null &&
CollectionUtils.isNotEmptyMap(invocation.getObjectAttachments()) ){
+ objectAttachments.putAll(invocation.getObjectAttachments());
+ }
+ for (Map.Entry<String, Object> entry : objectAttachments.entrySet()) {
String key = entry.getKey();
String value = (String) entry.getValue();
if (illegalHttpHeaderKey(key) || illegalHttpHeaderValue(value)) {