<T> T doPost(String uri, Map<String, String> headers, Map<String, Object> params, int readTimeout, Class<T> targetType){ for (;;){ try { return doPost(currentServer, uri, headers, params, readTimeout, targetType); } catch (AuthFailException e){ throw new IllegalArgumentException("appKey isn't right, please check"); } catch (Server503Exception | HttpRequest.HttpRequestException e){ String oldServer = currentServer; log.warn("current server({}) is maybe unavailable, trying to selects a new server", oldServer); selectServer(); log.warn("old server({}) is unavailable, select a new server({})", oldServer, currentServer); } } }
private Map<String, Object> doPostAsMap(String uri, Map<String, String> headers, Map<String, Object> params, int readTimeout){ return doPostAsMap(currentServer, uri, headers, params, readTimeout); }
private Map<String, Object> doPostAsMap(String server, String uri, Map<String, String> headers, Map<String, Object> params, int readTimeout){ for (;;){ try { Map<String, Object> respMap = doRequest(server, uri, HttpMethod.POST, headers, params, readTimeout); if (respMap == null || respMap.isEmpty()){ return null; } return respMap; } catch (AuthFailException e){ throw new IllegalArgumentException("appKey isn't right, please check"); } catch (Server503Exception | HttpRequest.HttpRequestException e){ // there are no servers available Sleeps.sleep(3); String oldServer = currentServer; log.warn("current server({}) is maybe unavailable, trying to selects a new server", currentServer); selectServer(); log.warn("old server({}) is unavailable, select a new server({})", oldServer, currentServer); server = currentServer; } } }
@Override public void doStart() { // select a server selectServer(); // init header initHttpHeaders(); }
/** * Finish the job instance's shard * @param shardFinishDto the job instance id * @return the finish shard resp */ public ShardOperateResp finishJobInstanceShard(ShardFinishDto shardFinishDto) { Map<String, Object> params = MapUtil.toMap(shardFinishDto); Map<String, Object> respMap = doPostAsMap(ClientUris.SHARD_FINISH, headers, params, 0); if (respMap == null){ return null; } Integer status = getRespStatus(respMap); if (Objects.equal(JsonResponse.OK, status)){ // ok Boolean success = Boolean.valueOf(respMap.get("data").toString()); return new ShardOperateResp(null, success); } // business error Integer code = getErrCode(respMap); return new ShardOperateResp(ShardOperateRespCode.from(code), null); }
<T> T doGet(String uri, Map<String, String> headers, Map<String, Object> params, Class<T> targetType){ for (;;){ try { return doGet(currentServer, uri, headers, params, targetType); } catch (AuthFailException e){ throw new IllegalArgumentException("appKey isn't right, please check"); } catch (Server503Exception | HttpRequest.HttpRequestException e){ Sleeps.sleep(2); String oldServer = currentServer; log.warn("current server({}) is unavailable, try to select a new server", oldServer); if(selectServer()){ log.info("old server({}) is unavailable, routed a select server({})", oldServer, currentServer); } else { log.warn("failed to select a new server, please check the server cluster"); Sleeps.sleep(5); } } } }
@Override public ShardOperateResp call() throws Exception { return client.getHttp().finishJobInstanceShard(shardFinishDto); } }
@Override public ShardPullResp call() throws Exception { return client.getHttp().pullJobInstanceShard(jobInstanceId); } }
private <T> T doGet(String server, String uri, Map<String, String> headers, Map<String, Object> params, Class<T> targetType){ Map<String, Object> respMap = doRequest(server, uri, HttpMethod.GET, headers, params, 0); if (respMap == null || respMap.isEmpty()){ return null; } return MapUtil.fromMap(respMap, targetType); }
@SuppressWarnings("unchecked") private Map<String, Object> checkRespErr(String respJson) { Map<String, Object> resp = JSON.parseObject(respJson, Map.class); Integer status = getRespStatus(resp); if (Objects.equal(JsonResponse.SERVER_ERR.getStatus(), status)){ throw new Server503Exception(); } else if (Objects.equal(JsonResponse.AUTH_FAIL.getStatus(), status)){ throw new AuthFailException(); } return resp; }
@SuppressWarnings("unchecked") private Map<String, Object> doRequest(String server, String uri, HttpMethod method, Map<String, String> headers, Map<String, Object> params, int readTimeout){ String reqUri = HTTP_PREFIX + server + ClientUris.CLIENTS + uri; Http http; if (method == HttpMethod.GET){ http = Http.get(reqUri); } else { http = Http.post(reqUri); } if (readTimeout > 0){ http.readTimeout(readTimeout); } if (headers != null){ http.headers(headers); } String resp = http.params(params).request(); if (Strings.isNullOrEmpty(resp)){ return null; } return checkRespErr(resp); }
/** * Return the job instance's shard * @param jobInstanceId the job instance id * @param shardId the shard id * @return the finish shard resp */ public ShardOperateResp returnJobInstanceShard(Long jobInstanceId, Long shardId) { Map<String, Object> params = Maps.newHashMapWithExpectedSize(3); params.put("instanceId", jobInstanceId); params.put("shardId", shardId); params.put("client", Systems.hostPid()); Map<String, Object> respMap = doPostAsMap(ClientUris.SHARD_RETURN, headers, params, 0); if (respMap == null){ return null; } Integer status = getRespStatus(respMap); if (Objects.equal(JsonResponse.OK, status)){ // ok Boolean success = Boolean.valueOf(respMap.get("data").toString()); return new ShardOperateResp(null, success); } // business error Integer code = getErrCode(respMap); return new ShardOperateResp(ShardOperateRespCode.from(code), null); }
@Override protected Boolean finishShard(ShardFinishDto shardFinishDto, ZkJob zkJob) { ShardOperateResp finishResp = client.getHttp().finishJobInstanceShard(shardFinishDto); if (finishResp.getSuccess()){ return Boolean.TRUE; } if (ShardOperateRespCode.needFinishAgain(finishResp.getCode())){ // TODO need retry to finish again } return Boolean.TRUE; } }
@Override protected PullShard pullShard(Long instanceId, final ZkJob zkJob) { ShardPullResp pullResp; for(;;){ pullResp = client.getHttp().pullJobInstanceShard(instanceId); if (pullResp == null){ return null; } if (ShardOperateRespCode.needPullAgain(pullResp.getCode())){ log.info("retry to pull shard(job={}, instanceId={}), resp={}", zkJob.getJob(), instanceId, pullResp); Sleeps.sleep(RETRY_INTERVAL); continue; } checkInvalidInstance(instanceId, zkJob, pullResp.getCode()); return pullResp.getPullShard(); } }
/** * Pull the job instance's shard * @param jobInstanceId the job instance id * @return the pull shard resp */ public ShardPullResp pullJobInstanceShard(Long jobInstanceId) { Map<String, Object> params = Maps.newHashMapWithExpectedSize(2); params.put("client", Systems.hostPid()); params.put("instanceId", jobInstanceId); Map<String, Object> respMap = doPostAsMap(ClientUris.SHARD_PULL, headers, params, 0); if (respMap == null){ return null; } Integer status = getRespStatus(respMap); if (Objects.equal(JsonResponse.OK, status)){ // ok PullShard shard = MapUtil.fromMap((Map<?, ?>)respMap.get("data"), PullShard.class); return new ShardPullResp(null, shard); } // business error Integer code = getErrCode(respMap); return new ShardPullResp(ShardOperateRespCode.from(code), null); }
@Override protected Boolean finishShard(final ShardFinishDto shardFinishDto, final ZkJob zkJob) { ShardOperateResp finishResp; for(;;){ finishResp = client.getHttp().finishJobInstanceShard(shardFinishDto); if (finishResp == null){ return null; } if (ShardOperateRespCode.needFinishAgain(finishResp.getCode())){ log.info("retry to finish shard(job={}, shardFinishDto={}), resp={}.", shardFinishDto, zkJob.getJob(), finishResp); Sleeps.sleep(RETRY_INTERVAL); continue; } checkInvalidInstance(shardFinishDto.getInstanceId(), zkJob, finishResp.getCode()); return finishResp.getSuccess(); } } }
private <T> T doPost(String server, String uri, Map<String, String> headers, Map<String, Object> params, int readTimeout, Class<T> targetType){ Map<String, Object> respMap = doPostAsMap(server, uri, headers, params, readTimeout); if (respMap == null || respMap.isEmpty()){ return null; } return MapUtil.fromMap(respMap, targetType); }