docs: public <T> T remote(final int index, final Object... params) {
          final SncpAction action = actions[index];
          final CompletionHandler handlerFunc = action.handlerFuncParamIndex >= 0 ? (CompletionHandler) params[action.handlerFuncParamIndex] : null;
          if (action.handlerFuncParamIndex >= 0) params[action.handlerFuncParamIndex] = null;
          final BsonReader reader = bsonConvert.pollBsonReader();
          CompletableFuture<byte[]> future = remote0(handlerFunc, remoteGroupTransport, null, action, params);
          if (action.boolReturnTypeFuture) { //与handlerFuncIndex互斥
              CompletableFuture result = action.futureCreator.create();
              future.whenComplete((v, e) -> {
                  try {
                      if (e != null) {
                          result.completeExceptionally(e);
                      } else {
                          reader.setBytes(v);
                          byte i;
                          while ((i = reader.readByte()) != 0) {
                              final Attribute attr = action.paramAttrs[i];
                              attr.set(params[i - 1], bsonConvert.convertFrom(attr.genericType(), reader));
                          }
                          Object rs = bsonConvert.convertFrom(Object.class, reader);
  
                          result.complete(rs);
                      }
                  } catch (Exception exp) {
                      result.completeExceptionally(exp);
                  } finally {
                      bsonConvert.offerBsonReader(reader);
                  }
              }); //需要获取  Executor
              return (T) result;
          }
          if (handlerFunc != null) return null;
          try {
              reader.setBytes(future.get(5, TimeUnit.SECONDS));
              byte i;
              while ((i = reader.readByte()) != 0) {
                  final Attribute attr = action.paramAttrs[i];
                  attr.set(params[i - 1], bsonConvert.convertFrom(attr.genericType(), reader));
              }
              return bsonConvert.convertFrom(action.handlerFuncParamIndex >= 0 ? Object.class : action.resultTypes, reader);
          } catch (RpcRemoteException re) {
              throw re;
          } catch (InterruptedException | ExecutionException | TimeoutException e) {
              //logger.log(Level.SEVERE, actions[index].method + " sncp (params: " + jsonConvert.convertTo(params) + ") remote error", e);
              throw new RpcRemoteException(actions[index].method + " sncp remote error", e);
          } finally {
              bsonConvert.offerBsonReader(reader);
          }
      }