XXL - JOB 원리 -- 실행 기 등록 (2)

1. xx - job 실행 기 를 작업 스케줄 러 센터 에 추가 하 는 두 가지 방식 이 있 습 니 다.
(1) 클 라 이언 트 실행 기 는 자동 으로 이름과 기계 주 소 를 작업 스케줄 러 센터 에 등록 합 니 다.
(2) 작업 스케줄 러 에서 실행 기 이름과 관련 된 기기 주 소 를 수 동 으로 입력 할 수 있 습 니 다 (여러 기기 주 소 는 쉼표 로 구분)
XXL-JOB原理--执行器注册(二)_第1张图片
2. 자동 등록 절차
(1) 실행 기 클 라 이언 트 에 실행 기 이름과 작업 스케줄 러 주 소 를 설정 합 니 다.
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
##        
xxl.job.admin.addresses=http://127.0.0.1:8080

### xxl-job executor address
##            
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=127.0.0.1
xxl.job.executor.port=9998

(2) 관련 등록 실행 코드:
실행 기 가 시 작 될 때 설정 을 읽 습 니 다. 작업 스케줄 러 주소 가 존재 하면 작업 스케줄 러 센터 에 순서대로 주 소 를 등록 합 니 다.
XxlJobExecutor 클래스 는 초기 화 할 때 다음 과 같이 작 동 합 니 다.
//            ,        , NetComClientProxy
private static void initAdminBizList(String adminAddresses, String accessToken) throws Exception {
        if (adminAddresses!=null && adminAddresses.trim().length()>0) {
            for (String address: adminAddresses.trim().split(",")) {
                if (address!=null && address.trim().length()>0) {
                    String addressUrl = address.concat(AdminBiz.MAPPING);
                    AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject();
                    if (adminBizList == null) {
                        adminBizList = new ArrayList();
                    }
                    adminBizList.add(adminBiz);
                }
            }
        }
    }

XxlJobExecutor 가 호출 될 때 getObject 방법 을 실행 하고 작업 스케줄 러 에 서비스 등록 요청 을 완료 합 니 다.
@Override
	public Object getObject() throws Exception {
		return Proxy.newProxyInstance(Thread.currentThread()
				.getContextClassLoader(), new Class[] { iface },
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

						// filter method like "Object.toString()"
						if (Object.class.getName().equals(method.getDeclaringClass().getName())) {
							logger.error(">>>>>>>>>>> xxl-rpc proxy class-method not support [{}.{}]", method.getDeclaringClass().getName(), method.getName());
							throw new RuntimeException("xxl-rpc proxy class-method not support");
						}
						
						// request
						RpcRequest request = new RpcRequest();
	                    request.setServerAddress(serverAddress);
	                    request.setCreateMillisTime(System.currentTimeMillis());
	                    request.setAccessToken(accessToken);
	                    request.setClassName(method.getDeclaringClass().getName());
	                    request.setMethodName(method.getName());
	                    request.setParameterTypes(method.getParameterTypes());
	                    request.setParameters(args);

	                    // send
						//                 
	                    RpcResponse response = client.send(request);
	                    
	                    // valid response
						if (response == null) {
							throw new Exception("Network request fail, response not found.");
						}
	                    if (response.isError()) {
	                        throw new RuntimeException(response.getError());
	                    } else {
	                        return response.getResult();
	                    }
	                   
					}
				});

Jetty Client 에서 send 방법 을 호출 하여 서비스 등록 작업 을 완료 합 니 다.
public RpcResponse send(RpcRequest request) throws Exception {
		try {
			// serialize request
			byte[] requestBytes = HessianSerializer.serialize(request);

			// reqURL
			String reqURL = request.getServerAddress();
			if (reqURL!=null && reqURL.toLowerCase().indexOf("http")==-1) {
				reqURL = "http://" + request.getServerAddress() + "/";	// IP:PORT, need parse to url
			}
            //  post        ,      IP      
			// remote invoke
			byte[] responseBytes = HttpClientUtil.postRequest(reqURL, requestBytes);
			if (responseBytes == null || responseBytes.length==0) {
				RpcResponse rpcResponse = new RpcResponse();
				rpcResponse.setError("Network request fail, RpcResponse byte[] is null");
				return rpcResponse;
            }

            // deserialize response
			RpcResponse rpcResponse = (RpcResponse) HessianSerializer.deserialize(responseBytes, RpcResponse.class);
			return rpcResponse;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);

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

서비스 등록 주소:http://127.0.0.1:8080/api
관련 등록 정 보 는 다음 과 같다.
XXL-JOB原理--执行器注册(二)_第2张图片
요약: 실제 실행 기 가 작업 스케줄 링 에 등록 한 정 보 는 매우 간단 하 다. 간단하게 응용 을 위 한 기본 정보, IP, 포트 와 응용 이름 등 이 라 고 볼 수 있 고 구체 적 인 작업 류 등 정 보 를 작업 스케줄 링 센터 에 등록 하지 않 아 도 되 기 때문에 작업 스케줄 링 센터 는 실행 기의 구체 적 인 정 보 를 감지 할 수 없다.운영 과 기술자 가 작업 스케줄 러 센터 에서 설정 을 선택해 야 합 니 다. 그렇지 않 으 면 작업 을 제대로 수행 할 수 없습니다.

좋은 웹페이지 즐겨찾기