日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

坐席排序java_坐席排队功能 - osc_sd6j22mg的个人空间 - OSCHINA - 中文开源技术交流社区...

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 坐席排序java_坐席排队功能 - osc_sd6j22mg的个人空间 - OSCHINA - 中文开源技术交流社区... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需求:坐席排隊? 五秒之內沒請求接口認為用戶不在排隊 從內存移除

redis用作消息隊列

1)實現過程: 用戶請求接口??查詢坐席有沒有空閑,坐席沒有空閑 繼續排隊???如果有 查詢redis中有沒有預先排隊的用戶??如果有 判斷是否是隊列中第一請求的用戶,如果是分配坐席,如果不是 更新隊列中的時間

2)添加一個定時任務類 每三百毫秒刷新一次? 查詢隊列中有沒有超時的用戶 超時之后將其移除

檢測坐席是否為空閑狀態

如果有空閑坐席 通過websocket 發送給客戶端消息 將坐席狀態修改為2,請查看 ocatedseat 方法

比較麻煩的幾點:

1)添加用戶到隊列中返回添加隊列的值(這個是lpush返回的)然后吧當前的值 和用戶請求過來的唯一id存到redis 中 以備 刷新時間用

long userindex = redisTemplate.opsForList().leftPush("GROUP_SEQUEUE_" + agent_group,JSONObject.toJSONString(map));

redisTemplate.opsForValue().set(uniqueid, String.valueOf(userindex));

2)刷新用戶時間:取出隊列的size 減去 第一步 存到redis中的值? 然后修改隊列中用戶的時間

long size = redisTemplate.opsForList().size("GROUP_SEQUEUE_" + agent_group);

String index = redisTemplate.opsForValue().get(uniqueid);

long sub = size - Integer.parseInt(index);

redisTemplate.opsForList().set("GROUP_SEQUEUE_" + agent_group,sub, JSONObject.toJSONString(map));

3)坐席狀態同步問題

weibsocket 心跳 必須與 狀態分開來發送否則會出現, 服務端發送給客戶端狀態為分配中時 而 客戶端在接受到的時候會有時間間隔,在這個間隔的時候 客戶端會發送之前的狀態給服務端 造成狀態不一致問題

public void handleMessage(WebSocketSession session,WebSocketMessage>message){

//解析message 修改坐席狀態

try{

User user = (User)session.getAttributes().get("user");

String state = message.getPayload().toString();

JSONObject json = JSONObject.parseObject(state);

String type = (String) json.get("type");

Object state1 = json.get("status");

String name = (String) json.get("name");

if("0".equals(type)){

//修改狀態

if(Integer.parseInt(state1.toString())==0){

redisTemplate.opsForSet().remove("OCATED", user.getUserid().toString());

}

redisTemplate.opsForList().remove("GROUP_"+user.getGroupid(), 0, JSONObject.toJSONString(user));

user.setState(Integer.parseInt(state1.toString()));

user.setNext_hop("123.57.144.26:9060/udp");

user.setTo("");

redisTemplate.opsForList().leftPush("GROUP_"+user.getGroupid(), JSONObject.toJSONString(user));

logger.info("收到坐席{}發來得消息!當前狀態為:{} ",user.getUserid(),state1,DateUtil.formateDate(new Date(), "yyyy-MM-dd HH:mm:ss"));

}else if("1".equals(type)){

//只檢測坐席是否掉線

this.hart.put(user, new Date());

// session.sendMessage(new TextMessage(JSONObject.toJSONString(user)+" "+new Date()));

}else if("2".equals(type)){

//會話接通 保存到redis中 定時插入數據庫

boolean flag = false;

Conversation con = new Conversation();

String reportnum = (String) json.get("reportnum");

String carnum = (String) json.get("carnum");

List str = redisTemplate.opsForList().range("conversation", 0, -1);

for(String s : str){

JSONObject j = JSONObject.parseObject(s);

con = JSONObject.toJavaObject(j,Conversation.class);

if(con.getCarnum().equals(carnum) && con.getReportnum().equals(reportnum)){

flag = true;

}

}

if(flag){

//已經保存過一次

Long endtime = (Long) json.get("endtime");

con.setEndtime(DateUtil.timestampToDate(endtime.toString()));;

}else{

Long starttime = (Long) json.get("starttime");

con.setUserid(user.getUserid());

con.setCarnum(carnum);

con.setStarttime(DateUtil.timestampToDate(starttime.toString()));

con.setReportnum(reportnum);

}

redisTemplate.opsForList().leftPush("conversation", JSONObject.toJSONString(con));

}else{

session.sendMessage(new TextMessage("參數錯誤!"));

}

}catch(Exception e){

logger.error(e.getMessage(),e);

}

}

下面奉上代碼

1、controller

package com.cloudunicomm.controller;

import java.io.IOException;

import java.io.OutputStream;

import java.text.ParseException;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.socket.WebSocketSession;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

import com.cloudunicomm.interceptor.MySocketHandler;

import com.cloudunicomm.utils.DateUtil;

import com.cloudunicomm.vo.User;

@Controller

public class FreeController {

private static final Logger logger = LoggerFactory.getLogger(FreeController.class);

@Autowired

private RedisTemplate redisTemplate;

@Bean

public MySocketHandler mySorketHandle() {

return new MySocketHandler();

}

@RequestMapping(value = "agent_service", method = RequestMethod.GET)

@ResponseBody

public void agentservice(HttpServletRequest request, HttpServletResponse response,

@RequestParam(name = "customer_id", required = false) String customer_id,

@RequestParam(name = "agent_group", required = false) String agent_group,

@RequestParam(name = "uniqueid", required = false) String uniqueid) throws IOException, ParseException {

//logger.info("組:{}---用戶:{}----唯一id:{}過來請求接口!",agent_group,customer_id,uniqueid);

StringBuffer sb = new StringBuffer();

OutputStream out = response.getOutputStream();

response.setHeader("Content-Disposition", "attachment; filename=" + DateUtil.getDate() + ".ini");

sb.append("reply_code=200\r\n").append("reply_reason='OK'\r\n");

//查詢有沒有空閑坐席

List users = redisTemplate.opsForList().range("GROUP_" + agent_group, 0, -1);

for (String s : users) {

User user = (User) JSONObject.toJavaObject(JSONObject.parseObject(s), User.class);

Boolean aa = redisTemplate.opsForSet().isMember("OCATED", user.getUserid().toString());

if (user.getState() == 0 && aa==false) {

//查詢有沒有排隊用戶

List lists = redisTemplate.opsForList().range("GROUP_SEQUEUE_" + agent_group, 0, -1);

if (lists.size() > 0) {

String str = lists.get(lists.size() - 1);

Set> obj = JSON.parseObject(str).entrySet();

for (Entry s1 : obj) {

if (s1.getKey().split("_")[1].equals(uniqueid)) {

redisTemplate.opsForList().remove("GROUP_SEQUEUE_"+agent_group, 0, JSONObject.toJSONString(s1));

this.ocatedseat(agent_group, user, customer_id, uniqueid);

sb.append("next_hop="+user.getNext_hop()+"\r\n");

sb.append("To="+user.getTo());

out.write(sb.toString().getBytes());

out.flush();

out.close();

return ;

//return ResultMessage.getSuccess().setMessage("已分配作息!");

}

}

}else{

this.ocatedseat(agent_group, user, customer_id, uniqueid);

sb.append("next_hop="+user.getNext_hop()+"\r\n");

sb.append("To="+user.getTo());

out.write(sb.toString().getBytes());

out.flush();

out.close();

return ;

}

}

}

String exit = redisTemplate.opsForValue().get(agent_group+"_"+uniqueid);

if(null == exit){

//沒有

this.adduserqueue(agent_group, uniqueid);

//return ResultMessage.getSuccess().setMessage("請等待!");

sb.append("retry_wait=5s");

out.write(sb.toString().getBytes());

out.flush();

out.close();

return;

}else{

//return ResultMessage.getSuccess().setMessage("繼續等待");

this.resettime(agent_group, uniqueid);

sb.append("retry_wait=5s");

out.write(sb.toString().getBytes());

out.flush();

out.close();

return;

}

}

/**

* 重置時間

* @param agent_group

* @param uniqueid

*/

public void resettime(String agent_group,String uniqueid){

Map map = new HashMap<>();

map.put(agent_group + "_" + uniqueid, new Date());

long size = redisTemplate.opsForList().size("GROUP_SEQUEUE_" + agent_group);

String index = redisTemplate.opsForValue().get(agent_group+"_"+uniqueid);

long sub = size - Integer.parseInt(index);

redisTemplate.opsForList().set("GROUP_SEQUEUE_" + agent_group,sub, JSONObject.toJSONString(map));

}

/**

* 添加用戶到隊列中

* @param map

* @param agent_group

* @param uniqueid

*/

public void adduserqueue(String agent_group,String uniqueid){

logger.info("組{}唯一{} 加入隊列",agent_group,uniqueid);

Map map = new HashMap<>();

map.put(agent_group + "_" + uniqueid, new Date());

long userindex = redisTemplate.opsForList().leftPush("GROUP_SEQUEUE_" + agent_group,JSONObject.toJSONString(map));

redisTemplate.opsForValue().set(agent_group+"_"+uniqueid, String.valueOf(userindex));

}

public void ocatedseat(String agent_group,User user ,String customer_id,String uniqueid) throws ParseException{

redisTemplate.opsForSet().add("OCATED", user.getUserid().toString());

user.setState(2);

WebSocketSession session = MySocketHandler.sessionid.get(user.getUserid().toString());

mySorketHandle().pushMsg(session.getId(), "2");

updateIndex(agent_group,uniqueid);

//sb.append(user.getNext_hop() + "\r\n").append(user.getTo());

logger.info("坐席{}正在被分配給{} ! {}", user.getUserid(),uniqueid,DateUtil.formateDate(new Date(), "yyyy-MM-dd HH:mm:ss"));

}

/**

* 更新索引值

* @param agent_group

* @param uniqueid

*/

private void updateIndex(String agent_group, String uniqueid) {

Set index = redisTemplate.keys(agent_group+"_*");

//比較的value

String comvalue = redisTemplate.opsForValue().get(agent_group+"_"+uniqueid);

for(String s : index ){

int l = Integer.parseInt(redisTemplate.opsForValue().get(s));

if(l>Integer.parseInt(comvalue)){

int reslu = l-1;

redisTemplate.opsForValue().set(s,String.valueOf(reslu));

}

}

redisTemplate.delete(agent_group+"_"+uniqueid);

}

}

2、定時任務

package com.cloudunicomm.task;

import java.text.ParseException;

import java.util.Date;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;

/**

* 檢測redis中過期的key

* @Title: CheckRedisKeyExpireTask.java

* @date: 2018年6月29日

* @author: zhangdong

* @version: v1.0

* @Description

*/

@Component

public class CheckRedisKeyExpireTask {

private static final Logger logger = LoggerFactory.getLogger(CheckRedisKeyExpireTask.class);

@Autowired

private RedisTemplate redisTemplate;

@Scheduled(cron="0/2 * * * * ? ") //每秒執行一次

//@Scheduled(fixedRate=3000)

public void job() throws ParseException {

//logger.info("開始檢測有沒有過期的key "+DateUtil.formateDate(new Date(), "yyyy-MM-dd HH:mm:ss"));

Set set = redisTemplate.keys("GROUP_SEQUEUE_*");

for(String s:set){

List sss = (List) redisTemplate.opsForList().range(s, 0, -1);

for(String m : sss){

Map maps = (Map)JSON.parse(m);

for(Entry entry : maps.entrySet()){

long start = entry.getValue();

long end = new Date().getTime();

if(end-entry.getValue()>500000){

//超時 從redis中移除

String[] keys = entry.getKey().toString().split("_");

redisTemplate.opsForList().remove("GROUP_SEQUEUE_"+keys[0], 0, maps.toString());

redisTemplate.delete(entry.getKey());

logger.info("組{}中的值{}已超過{}秒,將其移除!","GROUP_SEQUEUE_"+keys[0],maps.toString(),50);

}

}

}

}

}

}

總結

以上是生活随笔為你收集整理的坐席排序java_坐席排队功能 - osc_sd6j22mg的个人空间 - OSCHINA - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 嫩草网站在线观看 | 毛片在线免费观看网址 | 国产在线视频第一页 | 欧美成人片在线 | 欧美午夜精品一区二区三区电影 | 色呦呦网站 | 最新中文字幕在线观看视频 | 黄瓜视频在线免费看 | 97av在线视频 | 法国空姐在线观看免费 | 久久大胆视频 | 日本美女视频网站 | 欧美gv在线 | av影视在线观看 | 欧美色婷婷 | 专业操老外 | 亚洲无毛视频 | 在线免费观看a级片 | 久精品在线 | 国内毛片毛片毛片毛片 | 黄站在线观看 | 亚洲性网站 | 91视频99| 免费在线播放 | 欧洲-级毛片内射 | 精品人妻一区二区免费 | 久久久免费av | 国产亚洲精品久久久 | 久久久久久久久久久综合 | 中文字幕人妻一区 | gay男互凵gay男同偷精 | 成人片黄网站色大片免费毛片 | 涩涩视频在线看 | 五月婷婷色 | 阿v天堂2014 这里有精品 | 强行挺进皇后紧窄湿润小说 | 亚洲日本一区二区三区 | 88国产精品视频一区二区三区 | 香蕉爱视频 | 亚洲AV不卡无码一区二区三区 | 操人网 | 狠狠躁| 狼人色综合 | 久久黄网站 | 97播播| 国产精品国产精品国产专区不卡 | 午夜性刺激免费视频 | 你懂的亚洲 | 日韩网| 羞羞动漫在线观看 | 国产一级内谢 | 亚洲视频国产视频 | 亚洲另类春色 | 成人精品网址 | 中文字幕在线视频免费观看 | 亚洲欧美日本一区二区 | 奇米第四色首页 | 欧美毛片在线观看 | 得得的爱在线视频 | 香蕉视频在线观看免费 | 欧美一线高本道 | 91免费视频免费版 | 成人日韩精品 | 欧美激情视频一区二区 | 成人小视频在线播放 | 中文字幕黑丝 | 日日夜夜中文字幕 | 美日韩一区二区三区 | 欧美一区在线视频 | 久久精品导航 | 丝袜操| a级小视频 | 成av人片一区二区三区久久 | 精品www久久久久久奶水 | 外国黄色网址 | 国产免费黄色av | 无码国产精品久久一区免费 | 欧美日韩一区不卡 | 天天色影院 | free性欧美69巨大 | 黄色片aaaa | 精品无码国产一区二区三区51安 | 国产精久久一区二区三区 | 亚洲一区二区精华 | 亚洲欧美另类日韩 | 亚洲av成人一区二区国产精品 | 蜜臀av色欲a片无码精品一区 | 成人黄色免费在线观看 | 亚洲精品自拍 | 国产三级福利 | 国产精品无码久久久久一区二区 | 男人在线视频 | 日本艳妇 | 色涩视频在线观看 | 日韩h视频| 男阳茎进女阳道视频大全 | 色射影院 | 香蕉狠狠爱视频 | 波多野结衣一区二区三区 |