参加 工作刚好半年了
写点东西 记录下吧!
开发工具 intellij ,sourceTree(git),fiddler 抓包; jenkins 工程部署;
开发框架 play framework (异步编程), spring那一套; web前端 bootstrap
1:初识 异步promise
public Promise<Result> getNicknameByIdList(String userIdList) {
Promise<Map<String, String>> promises = userInfoService.getNicknameV2(userIdList);
return promises.map(new F.Function<Map<String, String>, Result>() {
@Override
public Result apply(Map<String, String> map) throws Throwable {
return Results.ok(JsonUtil.toJson(map));//将 promis 转化为 result
}
});
}
}
这样 就以一个promise 包裹住 getNicknameV2函数返回的结果 当promise获取结果数据后再进行map处理 ;
2: 当有多个promise 时 (比如是一个list)
/一串promise的 放到list后的在sequence map
public Promise<Map<String, String>> getNicknameV2(String ids) {
List<Promise<BaseDto<UserBaseInfoModel>>> promiseList = new ArrayList<Promise<BaseDto<UserBaseInfoModel>>>();
//List<String> uList = new ArrayList<String>();
String[] tokens = ids.split(",");
for (String dto : tokens) {
Promise<BaseDto<UserBaseInfoModel>> promise = userBaseInfo(Long.parseLong(dto));
promiseList.add(promise);
}
Promise<List<BaseDto<UserBaseInfoModel>>> allInOne = Promise.sequence(promiseList);
Promise<Map<String, String>> finalPromise = allInOne.map(new Function<List<BaseDto<UserBaseInfoModel>>, Map<String, String>>() {
@Override
public Map<String, String> apply(List<BaseDto<UserBaseInfoModel>> baseDtos) throws Throwable {
Map<String, String> resultMap = new HashMap();
if (baseDtos == null || baseDtos.size() == 0)
return resultMap;
for (int i = 0; i < baseDtos.size(); i ++)
{
BaseDto<UserBaseInfoModel> dto = baseDtos.get(i);
if (dto==null||dto.getData() == null || dto.getCode() != 200)
continue;;
UserBaseInfoModel model = dto.getData();
String userId = model.getUserId();
String nickName = model.getNickName();
resultMap.put(userId, nickName);
}
return resultMap;
}
});
return finalPromise;
}
这里对每一个userId 获取对应的 userBaseInfo promise ,然后将其放到一个promiseList 中 ,然后 用Promise的sequence方法
Promise<List<BaseDto<UserBaseInfoModel>>> allInOne = Promise.sequence(promiseList);
最后对 allInOne进行map操作即可;
3:多层次的Promise
public F.Promise<Result> searchUserId(final String username, final String password){ final String apiKey = SystemConfigService.getApikey(); final String apiSecret = SystemConfigService.getApisecret(); Map<String,String>params=new HashMap<String,String>(); params.put("apiKey",apiKey); params.put("checkType","LOGIN"); params.put("cid",UUID.randomUUID().toString()); params.put("timestamp", String.valueOf(Calendar.getInstance().getTime().getTime())); String url=SystemConfigService.getVszdApiUrl(); String port=SystemConfigService.getVszdPort(); url=url+port+"/neptune/user/secure_check/v1"; String apiSign= CryptoUtils.makeSha1Hash(params, apiSecret); url=url+"?apiSign="+apiSign; F.Promise<HttpResponse> respromise= HttpInvoker.post(url, params); F.Function<HttpResponse, String> func = new F.Function<HttpResponse, String>() { public String apply(HttpResponse response) { if (response.getStatus() != 200) { return ""; } JsonNode jsonNode = response.asJson(); /* if(!jsonNode.path("data").path("code").equals("200")){ return ""; }*/ String sessionId = jsonNode.path("data").path("sessionId").asText(); return sessionId; } }; F.Promise<String> sessionIdPromise = respromise.map(func); //get uid from login call F.Promise<Result> uidPromise = sessionIdPromise.flatMap(new F.Function<String, F.Promise<Result>>() { public F.Promise<Result> apply(String sessionId) { if (sessionId == null || sessionId.isEmpty()) { Result result = ok(AdminResult.result(CommonError.SYS_ERROR)); return F.Promise.pure(result); } Map<String, String> params = new HashMap<String, String>(); params.put("apiKey", apiKey); params.put("captchaCode", ""); params.put("userName", username); //params.put("password", MD5.md5(password)); params.put("password",(new Md5Hash(password)).toHex()); params.put("sessionId", sessionId); params.put("source", "zuida_android"); params.put("timestamp", String.valueOf(Calendar.getInstance().getTime().getTime())); String apiSign= CryptoUtils.makeSha1Hash(params, apiSecret); String port = SystemConfigService.getVszdPort(); String url = SystemConfigService.getVszdSapiUrl()+port+"/neptune/user/login/v1"+"?apiSign="+apiSign+"&"; F.Promise<HttpResponse> respromise = HttpInvoker.post(url, params); return respromise.map(new F.Function<HttpResponse, Result>() { @Override public Result apply(HttpResponse response) throws Throwable { if (response.getStatus() != 200) { return ok(AdminResult.result(CommonError.SYS_ERROR)); } JsonNode jsonNode = response.asJson(); if(jsonNode.path("code").asInt()!=200){ return ok(AdminResult.result(CommonError.SYS_ERROR)); } String uidStr = jsonNode.path("data").path("user").path("userId").asText(); return ok(AdminResult.ok(uidStr)); } }); } }); return uidPromise; }
这里先通过用户名密码 获取验签后的sessionIdPromise ,然后对其进行 flatMap 然后将其作为查询用户ID的 一个参数(sessionId)传递给另一个http请求;后一个http请求进行map 返回最终的结果;
另一个例子
public F.Promise<List<WishGoods>> getWishGoodsByGoodsNameOrCollocationId(String collocationGroupId, final String goodsName, final Paginator paginator){ F.Promise<List<String>> goodsIdListPromise = getGoodsIdListByCollocationGroupId(collocationGroupId); F.Promise<List<WishGoods>> wishGoodsByGoodsnameOrCollocationGroupId = goodsIdListPromise.flatMap(new F.Function<List<String>, F.Promise<List<WishGoods>>>()
{ @Override public F.Promise<List<WishGoods>> apply(List<String> goodsIdList) throws Throwable { PagingList<WishGoods> wishGoodsPagingList = WishGoods.getWishGoodsByGoodsIdListAndGoodsName(goodsIdList,goodsName,paginator); if(wishGoodsPagingList !=null) { paginator.setItems(wishGoodsPagingList.getTotalRowCount()); } else { paginator.setItems(0); } return F.Promise.pure(wishGoodsPagingList.getPage(paginator.getPage() - 1).getList()); } }); return wishGoodsByGoodsnameOrCollocationGroupId.flatMap(new F.Function<List<WishGoods>, F.Promise<List<WishGoods>>>() { public F.Promise<List<WishGoods>> apply(List<WishGoods> wishGoodsList) { List<F.Promise<WishGoods>> promiseList = new ArrayList<F.Promise<WishGoods>>(); for (final WishGoods wishGoodsTemp : wishGoodsList) { wishGoodsTemp.setSellingTimeConetent(DateUtil.format(wishGoodsTemp.getExpectSellingTime(), "yyyy-MM-dd")); final Long goodsStatus = wishGoodsTemp.getStatus(); F.Promise<Goods216StatusEnum> goods216StatusPromise = getGoods216Status(wishGoodsTemp.getGoodsId()); F.Promise<WishGoods> wishGoodsTempPromis = goods216StatusPromise.flatMap(new F.Function<Goods216StatusEnum, F.Promise<WishGoods>>() { @Override public F.Promise<WishGoods> apply(Goods216StatusEnum goods216Status) throws Throwable { String statusMsg; if (goods216Status.getCode().intValue() == Goods216StatusEnum.SALE_OUT_OR_OFFSHELF.getCode().intValue() && goodsStatus.intValue()==Goods216StatusEnum.REQUEST_ERROR.getCode().intValue()) { statusMsg = WishGoodsStatusEnum.getFromCode(goodsStatus).getMsg()+"(****)"; } else { statusMsg = WishGoodsStatusEnum.getFromCode(goodsStatus).getMsg(); } wishGoodsTemp.setStatusContent(statusMsg); if (wishGoodsTemp.getWishGoodsSN() != null) { F.Promise<List<WishGoodsCollocationGroup>> colPromise = getCollocationByWishGoodsSn(wishGoodsTemp.getWishGoodsSN());//url return colPromise.map(new F.Function<List<WishGoodsCollocationGroup>, WishGoods>() { @Override public WishGoods apply(List<WishGoodsCollocationGroup> collocations) throws Throwable { wishGoodsTemp.setCollocation(collocations); return wishGoodsTemp; } }); } return F.Promise.pure(wishGoodsTemp); } }); promiseList.add(wishGoodsTempPromis); } return F.Promise.sequence(promiseList); } }); }
:4:出错 recover 处理
return responsePromise.map(new F.Function<HttpResponse, String>() { @Override public String apply(HttpResponse response) throws Throwable { if(response.getStatus()!=200) { // return Results.badRequest(""); return null; } //String json=response.getBody(); String result = response.asJson().toString(); return result; } }).recover(new F.Function<Throwable, String>() { @Override public String apply(Throwable t) throws Throwable { Logger.error("setUserName error-->" + t.getMessage()); return SYS_ERROR; } });