in dubbo-rpc-extensions/dubbo-rpc-rocketmq/src/main/java/org/apache/dubbo/rpc/rocketmq/codec/DecodeableRpcInvocation.java [107:223]
public Object decode(Channel channel, InputStream input) throws IOException {
URL url = channel.getUrl();
ObjectInput in = CodecSupport.getSerialization(url)
.deserialize(url, input);
this.put(SERIALIZATION_ID_KEY, serializationType);
String dubboVersion = in.readUTF();
request.setVersion(dubboVersion);
setAttachment(DUBBO_VERSION_KEY, dubboVersion);
String path = in.readUTF();
setAttachment(PATH_KEY, path);
String version = in.readUTF();
setAttachment(VERSION_KEY, version);
setMethodName(in.readUTF());
String desc = in.readUTF();
setParameterTypesDesc(desc);
ClassLoader originClassLoader = Thread.currentThread().getContextClassLoader();
try {
Object[] args = RocketMQCodec.EMPTY_OBJECT_ARRAY;
Class<?>[] pts = RocketMQCodec.EMPTY_CLASS_ARRAY;
if (desc.length() > 0) {
FrameworkServiceRepository repository = frameworkModel.getServiceRepository();
List<ProviderModel> providerModels = repository.lookupExportedServicesWithoutGroup(keyWithoutGroup(path, version));
ServiceDescriptor serviceDescriptor = null;
if (CollectionUtils.isNotEmpty(providerModels)) {
for (ProviderModel providerModel : providerModels) {
serviceDescriptor = providerModel.getServiceModel();
if (serviceDescriptor != null) {
break;
}
}
}
if (serviceDescriptor == null) {
// Unable to find ProviderModel from Exported Services
for (ApplicationModel applicationModel : frameworkModel.getApplicationModels()) {
for (ModuleModel moduleModel : applicationModel.getModuleModels()) {
serviceDescriptor = moduleModel.getServiceRepository().lookupService(path);
if (serviceDescriptor != null) {
break;
}
}
}
}
if (serviceDescriptor != null) {
MethodDescriptor methodDescriptor = serviceDescriptor.getMethod(getMethodName(), desc);
if (methodDescriptor != null) {
pts = methodDescriptor.getParameterClasses();
this.setReturnTypes(methodDescriptor.getReturnTypes());
// switch TCCL
if (CollectionUtils.isNotEmpty(providerModels)) {
if (providerModels.size() == 1) {
Thread.currentThread().setContextClassLoader(providerModels.get(0).getClassLoader());
} else {
// try all providerModels' classLoader can load pts, use the first one
for (ProviderModel providerModel : providerModels) {
ClassLoader classLoader = providerModel.getClassLoader();
boolean match = true;
for (Class<?> pt : pts) {
try {
if (!pt.equals(classLoader.loadClass(pt.getName()))) {
match = false;
}
} catch (ClassNotFoundException e) {
match = false;
}
}
if (match) {
Thread.currentThread().setContextClassLoader(classLoader);
break;
}
}
}
}
}
}
if (pts == RocketMQCodec.EMPTY_CLASS_ARRAY) {
if (!RpcUtils.isGenericCall(desc, getMethodName()) && !RpcUtils.isEcho(desc, getMethodName())) {
throw new IllegalArgumentException("Service not found:" + path + ", " + getMethodName());
}
pts = ReflectUtils.desc2classArray(desc);
}
// }
args = new Object[pts.length];
for (int i = 0; i < args.length; i++) {
args[i] = in.readObject(pts[i]);
}
}
setParameterTypes(pts);
Map<String, Object> map = in.readAttachments();
if (CollectionUtils.isNotEmptyMap(map)) {
addObjectAttachments(map);
}
setArguments(args);
String targetServiceName = buildKey(getAttachment(PATH_KEY),
getAttachment(GROUP_KEY),
getAttachment(VERSION_KEY));
setTargetServiceUniqueName(targetServiceName);
} catch (ClassNotFoundException e) {
throw new IOException(StringUtils.toString("Read invocation data failed.", e));
} finally {
Thread.currentThread().setContextClassLoader(originClassLoader);
if (in instanceof Cleanable) {
((Cleanable) in).cleanup();
}
}
return this;
}