Java源码示例:org.apache.servicecomb.core.Handler

示例1
private Holder<Boolean> checkQpsFlowControl(OperationMeta operationMeta) {
  Holder<Boolean> qpsFlowControlReject = new Holder<>(false);
  @SuppressWarnings("deprecation")
  Handler providerQpsFlowControlHandler = operationMeta.getProviderQpsFlowControlHandler();
  if (null != providerQpsFlowControlHandler) {
    try {
      providerQpsFlowControlHandler.handle(invocation, response -> {
        qpsFlowControlReject.value = true;
        sendResponse(header.getContext(), response);
      });
    } catch (Exception e) {
      LOGGER.error("failed to execute ProviderQpsFlowControlHandler", e);
      qpsFlowControlReject.value = true;
      sendResponse(header.getContext(), Response.providerFailResp(e));
    }
  }
  return qpsFlowControlReject;
}
 
示例2
private Holder<Boolean> checkQpsFlowControl(OperationMeta operationMeta) {
  Holder<Boolean> qpsFlowControlReject = new Holder<>(false);
  @SuppressWarnings("deprecation")
  Handler providerQpsFlowControlHandler = operationMeta.getProviderQpsFlowControlHandler();
  if (null != providerQpsFlowControlHandler) {
    try {
      providerQpsFlowControlHandler.handle(invocation, response -> {
        qpsFlowControlReject.value = true;
        produceProcessor = ProduceProcessorManager.INSTANCE.findDefaultJsonProcessor();
        sendResponse(response);
      });
    } catch (Throwable e) {
      LOGGER.error("failed to execute ProviderQpsFlowControlHandler", e);
      qpsFlowControlReject.value = true;
      sendFailResponse(e);
    }
  }
  return qpsFlowControlReject;
}
 
示例3
@Test
public void doInvoke(@Mocked Endpoint endpoint, @Mocked OperationMeta operationMeta,
    @Mocked Object[] swaggerArguments, @Mocked SchemaMeta schemaMeta) throws Throwable {
  Response response = Response.ok("ok");
  Handler handler = (invocation, asyncResp) -> asyncResp.complete(response);
  List<Handler> handlerChain = Arrays.asList(handler);
  Deencapsulation.setField(invocation, "handlerList", handlerChain);

  Holder<Response> result = new Holder<>();
  restInvocation = new AbstractRestInvocationForTest() {
    @Override
    protected void sendResponse(Response response) {
      result.value = response;
    }
  };
  restInvocation.invocation = invocation;

  restInvocation.doInvoke();

  Assert.assertSame(response, result.value);
  assertEquals(nanoTime, invocation.getInvocationStageTrace().getStartHandlersRequest());
  assertEquals(nanoTime, invocation.getInvocationStageTrace().getFinishHandlersResponse());
}
 
示例4
/**
 * Only for JavaChassis internal usage.
 */
@Deprecated
public Handler getProviderQpsFlowControlHandler() {
  if (providerQpsFlowControlHandlerSearched) {
    return providerQpsFlowControlHandler;
  }

  for (Handler handler : handlerChain) {
    // matching by class name is more or less better than importing an extra maven dependency
    if ("org.apache.servicecomb.qps.ProviderQpsFlowControlHandler".equals(handler.getClass().getName())) {
      providerQpsFlowControlHandler = handler;
      break;
    }
  }
  providerQpsFlowControlHandlerSearched = true;
  return providerQpsFlowControlHandler;
}
 
示例5
private List<Class<Handler>> convertToChainClass(String chainDef) {
  List<Class<Handler>> result = new ArrayList<>();
  if (StringUtils.isEmpty(chainDef)) {
    return result;
  }

  String[] handlerIds = chainDef.split(",");
  Map<String, Class<Handler>> handlerMaps = config.getHandlerClassMap();
  for (String handlerId : handlerIds) {
    if (handlerId != null) {
      handlerId = handlerId.trim();
    }
    if (StringUtils.isEmpty(handlerId)) {
      continue;
    }

    Class<Handler> cls = handlerMaps.get(handlerId);
    if (cls == null) {
      throw new Error("can not find handler :" + handlerId);
    }
    result.add(cls);
  }
  return result;
}
 
示例6
private List<Handler> createHandlerChain(String chainDef) {
  List<Class<Handler>> chainClasses = convertToChainClass(chainDef);

  List<Handler> handlerList = new ArrayList<>();
  for (Class<Handler> cls : chainClasses) {
    try {
      handlerList.add(cls.newInstance());
    } catch (Exception e) {
      // 在启动阶段直接抛异常出来
      throw new Error(e);
    }
  }
  handlerList.add(getLastHandler());
  return handlerList;
}
 
示例7
@Override
protected List<Handler> create(String microserviceName) {
  String handlerChainKey = "servicecomb.handler.chain." + getName() + ".service." + microserviceName;
  String chainDef = DynamicPropertyFactory.getInstance()
      .getStringProperty(handlerChainKey,
          defaultChainDef)
      .get();
  LOGGER.info("get handler chain for [{}]: [{}]", handlerChainKey, chainDef);
  return createHandlerChain(chainDef);
}
 
示例8
@SuppressWarnings("deprecation")
@Test
public void scheduleInvocation_flowControlReject() {
  new Expectations(operationMeta) {
    {
      operationMeta.getProviderQpsFlowControlHandler();
      result = (Handler) (invocation, asyncResp) -> asyncResp.producerFail(new InvocationException(
          new HttpStatus(429, "Too Many Requests"),
          new CommonExceptionData("rejected by qps flowcontrol")));
    }
  };
  Holder<Integer> status = new Holder<>();
  Holder<String> reasonPhrase = new Holder<>();
  Holder<Integer> endCount = new Holder<>(0);
  Holder<String> responseBody = new Holder<>();
  responseEx = new AbstractHttpServletResponse() {
    @SuppressWarnings("deprecation")
    @Override
    public void setStatus(int sc, String sm) {
      status.value = sc;
      reasonPhrase.value = sm;
    }

    @Override
    public void flushBuffer() {
      endCount.value = endCount.value + 1;
    }

    @Override
    public void setContentType(String type) {
      assertEquals("application/json; charset=utf-8", type);
    }

    @Override
    public void setBodyBuffer(Buffer bodyBuffer) {
      responseBody.value = bodyBuffer.toString();
    }
  };
  initRestInvocation();
  restInvocation.scheduleInvocation();

  assertEquals(Integer.valueOf(429), status.value);
  assertEquals("Too Many Requests", reasonPhrase.value);
  assertEquals("{\"message\":\"rejected by qps flowcontrol\"}", responseBody.value);
  assertEquals(Integer.valueOf(1), endCount.value);
}
 
示例9
public List<Handler> getHandlerChain() {
  return handlerChain;
}
 
示例10
public void setHandlerChain(List<Handler> handlerChain) {
  this.handlerChain = handlerChain;
}
 
示例11
/**
 * Only for JavaChassis internal usage.
 */
@Deprecated
public Handler getProviderQpsFlowControlHandler() {
  return getMicroserviceMeta().getProviderQpsFlowControlHandler();
}
 
示例12
@Override
protected Handler getLastHandler() {
  return TransportClientHandler.INSTANCE;
}
 
示例13
@Override
protected Handler getLastHandler() {
  return ProducerOperationHandler.INSTANCE;
}
 
示例14
@JacksonXmlProperty(localName = "class", isAttribute = true)
public Class<Handler> getClazz() {
  return clazz;
}
 
示例15
public void setClazz(Class<Handler> clazz) {
  this.clazz = clazz;
}
 
示例16
@SuppressWarnings("unchecked")
public void setClazz(String clazz) throws ClassNotFoundException {
  this.clazz = (Class<Handler>) Class.forName(clazz);
}
 
示例17
public Map<String, Class<Handler>> getHandlerClassMap() {
  return this.handlerClassMap;
}
 
示例18
protected abstract Handler getLastHandler();