//1 查出来当前在线的人员
Set<String> keySet = redisCacheUtil.getCacheObjectAll(ImEnum.REDIS_ONLINE.getName() + "*");
ArrayList<ImLoginStatusBean> onlineUsers = new ArrayList();
keySet.stream().forEach(key -> {
String onlineUser = redisCacheUtil.getCacheObject(key);
//将查询的数据解析出来,放入list
onlineUsers.add(JSONObject.parseObject(onlineUser, ImLoginStatusBean.class));
});
//获取在线的客服数据 过滤出在线的人员
List<ImLoginStatusBean> onlineList = onlineUsers.stream().filter(loginStatusBean -> loginStatusBean.getfState().equals(ImEnum.LOGIN_ONLINE.getCode())).collect(Collectors.toList());
//获取数据中的最小权重
OptionalInt minWeight = onlineList.stream().mapToInt(ImLoginStatusBean::getfWeight).min();
Integer min;
if(minWeight.isPresent() == false){
min = 0;
}else{
min = minWeight.getAsInt();
}
//最小权重的客服进行分配
List<ImLoginStatusBean> minWeightUsers = onlineList.stream().filter(loginStatusBean -> loginStatusBean.getfWeight().equals(min)).collect(Collectors.toList());
在实际的需求中,在客服登录时将在线信息放入redis中,再将在线客服信息取出,过滤出所需的在线客服,对客服进行分配。
在分配客服时,为避免出现分配不均,每一个在线人员都会加一个权重,分配一人,则权重加1,取最小权重人进行分配,如果是刚登陆客服,则取最小权重,放入队列之中。