dubbo相关问题

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);
    }
  }

猜你喜欢

转载自1181731633.iteye.com/blog/2404987