1、异步调用问题:假如A->B->C三个应用调用关系,将A->B的设置为async=true,则B->C自动也是异步。因为RpcContext里面的Attachments是final类型,会传递。
2、hession序列化:Hessian是dubbo的默认序列化协议,它比java的序列化性能要高很多。当hessian序列化一个对象时,默认的序列化类是com.caucho.hessian.io. JavaSerializer。当子类和父类同名字段被覆盖,会发生覆盖,导致最终值出问题。参考一,可通过删除子类相同字段。也可以通过改变序列化方式,参考;
public JavaDeserializer(Class cl) { _type = cl; _fieldMap = getFieldMap(cl); ....... protected HashMap getFieldMap(Class cl) { HashMap fieldMap = new HashMap(); for (; cl != null; cl = cl.getSuperclass()) { Field []fields = cl.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; if (Modifier.isTransient(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) continue; else if (fieldMap.get(field.getName()) != null) continue; ...... private Object readObjectInstance(Class cl, ObjectDefinition def) throws IOException { String type = def.getType(); String []fieldNames = def.getFieldNames(); ...... public Object readObject(AbstractHessianInput in, Object obj, String []fieldNames) throws IOException { try { int ref = in.addRef(obj); for (int i = 0; i < fieldNames.length; i++) { String name = fieldNames[i]; //重名的话,取出的都是私有的属性 FieldDeserializer deser = (FieldDeserializer) _fieldMap.get(name); if (deser != null) // 当in读到父类时,把本类的属性值覆盖掉了 deser.deserialize(in, obj); else in.readObject(); } Object resolve = resolve(obj); if (obj != resolve) in.setRef(ref, resolve); return resolve; } catch (IOException e) { throw e; } catch (Exception e) { throw new IOExceptionWrapper(obj.getClass().getName() + ":" + e, e); } }