Skip to content

Commit 868db1b

Browse files
author
liujianjun.ljj
committed
Fix serialization and deserialization classloader issues in serverless scene
1 parent e1ddc67 commit 868db1b

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

remoting/remoting-triple/src/main/java/com/alipay/sofa/rpc/message/triple/stream/ClientStreamObserverAdapter.java

+16-5
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public ClientStreamObserverAdapter(SofaStreamObserver<Object> sofaStreamObserver
5454
@Override
5555
public void onNext(triple.Response response) {
5656
byte[] responseData = response.getData().toByteArray();
57-
Object appResponse = null;
57+
Object appResponse;
5858
String returnTypeName = response.getType();
5959
if (responseData != null && responseData.length > 0) {
6060
ClassLoader oldClassloader = Thread.currentThread().getContextClassLoader();
@@ -64,24 +64,35 @@ public void onNext(triple.Response response) {
6464
returnType = Class.forName(returnTypeName, true, classLoader);
6565
}
6666
appResponse = serializer.decode(new ByteArrayWrapperByteBuf(responseData), returnType, null);
67+
sofaStreamObserver.onNext(appResponse);
6768
} catch (ClassNotFoundException e) {
6869
throw new SofaRpcException(RpcErrorType.CLIENT_DESERIALIZE, "Can not find return type :" + returnType,
6970
e);
7071
} finally {
7172
Thread.currentThread().setContextClassLoader(oldClassloader);
7273
}
7374
}
74-
75-
sofaStreamObserver.onNext(appResponse);
7675
}
7776

7877
@Override
7978
public void onError(Throwable t) {
80-
sofaStreamObserver.onError(t);
79+
ClassLoader oldClassloader = Thread.currentThread().getContextClassLoader();
80+
try {
81+
Thread.currentThread().setContextClassLoader(classLoader);
82+
sofaStreamObserver.onError(t);
83+
} finally {
84+
Thread.currentThread().setContextClassLoader(oldClassloader);
85+
}
8186
}
8287

8388
@Override
8489
public void onCompleted() {
85-
sofaStreamObserver.onCompleted();
90+
ClassLoader oldClassloader = Thread.currentThread().getContextClassLoader();
91+
try {
92+
Thread.currentThread().setContextClassLoader(classLoader);
93+
sofaStreamObserver.onCompleted();
94+
} finally {
95+
Thread.currentThread().setContextClassLoader(oldClassloader);
96+
}
8697
}
8798
}

remoting/remoting-triple/src/main/java/com/alipay/sofa/rpc/server/triple/GenericServiceImpl.java

+23-6
Original file line numberDiff line numberDiff line change
@@ -131,20 +131,37 @@ public StreamObserver<Request> genericBiStream(StreamObserver<Response> response
131131

132132
@Override
133133
public void onNext(Request request) {
134-
checkInitialize(request);
135-
Object message = getInvokeArgs(request, argTypes, serializer, false)[0];
136-
serverResponseHandler.setSerializeType(serializeType);
137-
clientHandler.onNext(message);
134+
try {
135+
Thread.currentThread().setContextClassLoader(serviceClassLoader);
136+
checkInitialize(request);
137+
Object message = getInvokeArgs(request, argTypes, serializer, false)[0];
138+
serverResponseHandler.setSerializeType(serializeType);
139+
clientHandler.onNext(message);
140+
} finally {
141+
Thread.currentThread().setContextClassLoader(oldClassLoader);
142+
}
138143
}
139144

140145
@Override
141146
public void onError(Throwable t) {
142-
clientHandler.onError(t);
147+
try {
148+
Thread.currentThread().setContextClassLoader(serviceClassLoader);
149+
clientHandler.onError(t);
150+
} finally {
151+
Thread.currentThread().setContextClassLoader(oldClassLoader);
152+
}
153+
143154
}
144155

145156
@Override
146157
public void onCompleted() {
147-
clientHandler.onCompleted();
158+
try {
159+
Thread.currentThread().setContextClassLoader(serviceClassLoader);
160+
clientHandler.onCompleted();
161+
} finally {
162+
Thread.currentThread().setContextClassLoader(oldClassLoader);
163+
}
164+
148165
}
149166

150167
private void checkInitialize(Request request) {

0 commit comments

Comments
 (0)