天天看點

XXL-JOB原理--任務排程中心執行器注冊(三)

        在上一篇部落格​​XXL-JOB學習--執行器注冊(一)​​中我們介紹了xxl-job執行器注冊到任務排程中心的流程及相關注冊資訊,接下來我們看看任務排程中心接受任務注冊後做了哪些事情。

一、注冊位址

位址:​​http://127.0.0.1:8080/api​​

任務排程中心對外提供注冊位址/api用來接受任務執行器注冊的相關伺服器資訊

1、xxl-job admin通過JobApiController來對外提供/api接口

@Controller
public class JobApiController {
    private static Logger logger = LoggerFactory.getLogger(JobApiController.class);

    private RpcResponse doInvoke(HttpServletRequest request) {
        try {
            // deserialize request
            byte[] requestBytes = HttpClientUtil.readBytes(request);
            if (requestBytes == null || requestBytes.length==0) {
                RpcResponse rpcResponse = new RpcResponse();
                rpcResponse.setError("RpcRequest byte[] is null");
                return rpcResponse;
            }
            //反序列化資料
            RpcRequest rpcRequest = (RpcRequest) HessianSerializer.deserialize(requestBytes, RpcRequest.class);

            // invoke
            //調用服務注冊方法
            RpcResponse rpcResponse = NetComServerFactory.invokeService(rpcRequest, null);
            return rpcResponse;
        } catch (Exception e) {
            logger.error(e.getMessage(), e);

            RpcResponse rpcResponse = new RpcResponse();
            rpcResponse.setError("Server-error:" + e.getMessage());
            return rpcResponse;
        }
    }

    //對外提供api接口
    @RequestMapping(AdminBiz.MAPPING)
    @PermessionLimit(limit=false)
    public void api(HttpServletRequest request, HttpServletResponse response) throws IOException {

        // invoke
        RpcResponse rpcResponse = doInvoke(request);

        // serialize response
        byte[] responseBytes = HessianSerializer.serialize(rpcResponse);

        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        //baseRequest.setHandled(true);

        OutputStream out = response.getOutputStream();
        out.write(responseBytes);
        out.flush();
    }

}      

在NetComServerFactory類中調用invokeService方法,根據反射調用AdminBiz接口的實作類AdminBizImpl的register方法完成服務注冊操作

public static RpcResponse invokeService(RpcRequest request, Object serviceBean) {
    if (serviceBean==null) {
      serviceBean = serviceMap.get(request.getClassName());
    }
    if (serviceBean == null) {
      // TODO
    }

    RpcResponse response = new RpcResponse();

    if (System.currentTimeMillis() - request.getCreateMillisTime() > 180000) {
      response.setResult(new ReturnT<String>(ReturnT.FAIL_CODE, "The timestamp difference between admin and executor exceeds the limit."));
      return response;
    }
    if (accessToken!=null && accessToken.trim().length()>0 && !accessToken.trim().equals(request.getAccessToken())) {
      response.setResult(new ReturnT<String>(ReturnT.FAIL_CODE, "The access token[" + request.getAccessToken() + "] is wrong."));
      return response;
    }

    try {
      //接口AdminBiz的實作類AdminBizImpl
      Class<?> serviceClass = serviceBean.getClass();
      //AdminBiz的register方法
      String methodName = request.getMethodName();
      Class<?>[] parameterTypes = request.getParameterTypes();
      Object[] parameters = request.getParameters();

      FastClass serviceFastClass = FastClass.create(serviceClass);
      //調用AdminBizImpl的register方法
      FastMethod serviceFastMethod = serviceFastClass.getMethod(methodName, parameterTypes);

      Object result = serviceFastMethod.invoke(serviceBean, parameters);

      response.setResult(result);
    } catch (Throwable t) {
      t.printStackTrace();
      response.setError(t.getMessage());
    }

    return response;
  }      

調用的類:

XXL-JOB原理--任務排程中心執行器注冊(三)

參數:基本的伺服器資訊

XXL-JOB原理--任務排程中心執行器注冊(三)

在AdminBiz的實作類AdminBizImpl中調用dao完成注冊資訊入庫操作:

@Override
public ReturnT<String> registry(RegistryParam registryParam) {
    //在xxl_job_qrtz_trigger_registry表中添加或更新資料
        int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
        if (ret < 1) {
            xxlJobRegistryDao.registrySave(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
        }
        return ReturnT.SUCCESS;
}      

表中資料:

XXL-JOB原理--任務排程中心執行器注冊(三)

繼續閱讀