基于SpringMVC框架实现客服聊天
来源:互联网 发布:大数据平台服务目录 编辑:程序博客网 时间:2024/05/16 12:35
<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springMVC.xml</param-value></init-param><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
2、客户端代码:
<script type="text/javascript">var sendId ="";var isReceiver = false;function longPolling() {if(isReceiver) {$.ajax({url : "../longPolling/customer/receive",data : {"receiverId" : "123", "time" : new Date()},dataType : "json",type : "POST",success : function(data) {console.log(data);if(data.code == "success"){var $tbody = "";$.each(data.data, function(index, value) {var $tr = "";$tr += "<tr><td>"+value.receiverId+"</td><td>"+value.sendId+"</td><td>"+value.context+"</td><td>"+value.date+"</td></tr>"$tbody += $tr;});$("#message").append($tbody);} longPolling();},error : function(XMLHttpRequest) {console.log(XMLHttpRequest.status);if (XMLHttpRequest.status == "500") { //超时longPolling();} else {isReceiver = false;}}});}}$(function(){$('#startReceive').click(function() {isReceiver = true;longPolling();});$("#startSend").click(function() {//alert("123");$.ajax({url : "../common/createId",type : "post",dataType : "json",data : {"time" : new Date()}, success : function(msg) { console.log(msg);sendId = msg.data;}, error : function() {}});});$("#send").click(function() {if(sendId != "") {var context = $("#sendMessage").val();//alert(text);$.ajax({url : "../longPolling/customer/send",type : "post",dataType : "json",data : {"receiverId" : "123", "sendId" : sendId, "context" : context, "time" : new Date()}, success : function(msg) {console.log(msg);$("#sendMessage").val("");}, error : function() {}});} else {alert("请先点击开始!");}});window.onbeforeunload = function() {isReceiver = false;$.ajax({url : "../longPolling/customer/clear",type : "post",dataType : "json",data : {"receiverId" : "123", "time" : new Date()}, success : function(msg) {console.log(msg);}, error : function() {}});}})</script></head><body><button id="startSend">开始</button><br><br><input type="text" id="sendMessage"/><button id = "send">发送</button><br><button id = "startReceive">startReceive</button><table id ="message"></table></body>
3、控制层代码:
就这样完了。。。
推送消息接口:
public DeferredResult<ResultDTO> receiverMessage(final String receiverId) {DeferredResult<ResultDTO> result = new DeferredResult<ResultDTO>(90000L);/** * http连接先查询仓库中是否有消息 */Integer messageSize = longCustomerService.countReceiverMessageNum(receiverId);SysoutLogUtil.log(messageSize);if(messageSize > 0){result.setResult(new ResultDTO("success", "", longCustomerService.listMessage(receiverId)));}longCustomerService.saveReceiverRequest(receiverId, result);result.onCompletion(new Runnable() {@Overridepublic void run() {longCustomerService.removeReceiverRequest(receiverId);}});SysoutLogUtil.log("获取到"+messageSize+"条消息");return result;}发送消息接口:
public Object sendMessage(String receiverId, String sendId, String context) {MessageDO message = new MessageDO(receiverId, sendId, context);longCustomerService.saveMessage(message);return new ResultDTO("success");}
浏览器刷新接口:
public Object clearRequest(String receiverId){SysoutLogUtil.log("调用了刷新接口"+receiverId +"end");longCustomerService.removeReceiverRequest(receiverId);return new ResultDTO("success");}
4、Service层代码:
private static Map<String, DeferredResult<ResultDTO>> receiverRequest = new ConcurrentHashMap<String, DeferredResult<ResultDTO>>();private static ConcurrentHashMap<String, ConcurrentLinkedQueue<MessageDO>> repository = new ConcurrentHashMap<>();@Overridepublic void saveMessage(MessageDO message) {String receiverId = message.getReceiverId();/** * 检测是否有http连接 */DeferredResult<ResultDTO> result = receiverRequest.get(receiverId);if(result != null){SysoutLogUtil.log("有http连接,直接输出消息!");List<MessageDO> receiverMessage = new ArrayList<>();receiverMessage.add(message);result.setResult(new ResultDTO("success", "", receiverMessage));return;}/** * 没有http连接入库 */ConcurrentLinkedQueue<MessageDO> messageQueue = repository.get(receiverId);if(messageQueue == null){messageQueue = new ConcurrentLinkedQueue<>();messageQueue.add(message);} else {messageQueue.add(message);}SysoutLogUtil.log(messageQueue.size());repository.put(receiverId, messageQueue);}@Overridepublic List<MessageDO> listMessage(String receiverId) {List<MessageDO> receiverMessage = new ArrayList<>();ConcurrentLinkedQueue<MessageDO> messageQueue = repository.get(receiverId);if(messageQueue == null){return null;} else {while (messageQueue.peek() != null) {receiverMessage.add(messageQueue.poll());}}return receiverMessage;}@Overridepublic Integer countReceiverMessageNum(String receiverId) {ConcurrentLinkedQueue<MessageDO> messageQueue = repository.get(receiverId);if(messageQueue == null){return 0;} else {return messageQueue.size();}}@Overridepublic void saveReceiverRequest(String receiverId, DeferredResult<ResultDTO> Object) {receiverRequest.put(receiverId, Object);}@Overridepublic void removeReceiverRequest(String receiverId) {SysoutLogUtil.log("删除"+receiverId+"的连接");receiverRequest.remove(receiverId);}
就这样完了。。。
0 0
- 基于SpringMVC框架实现客服聊天
- 基于环信实现android客户端客服聊天功能
- html实现qq聊天客服
- 基于webScoket的在线客服聊天
- Linux 下基于多线程服务器/客服端聊天程序源码
- 一款基于微客服的仿微信的聊天软件
- 如何实现点击按钮实现QQ在线联系客服聊天
- APP内跳转QQ和陌生人聊天实现客服功能
- Android 集成阿里百川实现在线客服、聊天功能
- Spring框架之基于Restful风格实现的SpringMVC
- 【Java】基于SpringMVC框架实现静态页面伪装
- SSM框架+WebSocket实现网页聊天(Spring+SpringMVC+MyBatis+WebSocket)
- QQ客服 强制聊天
- 网站客服聊天
- Android开发之基于MINA框架的聊天通信功能实现
- 基于mina框架的语音聊天服务器
- 基于TCP,多线程的聊天框架代码
- 基于TCP,多线程的聊天框架代码
- animation animator controller
- 蓝桥杯 算法提高 学霸的迷宫 (bfs+路径记录)
- JVM 的类文件结构
- Hdu1051 Wooden Sticks
- 类和对象
- 基于SpringMVC框架实现客服聊天
- 蓝桥杯ALGO-39——算法训练 数组排序去重
- leetCode---Target Sum
- 螺旋矩阵
- Hibernate的核心对象关系映射
- easyui里的layout折叠显示标题
- Android蓝牙通信——安卓蓝牙obtainMessage数据传输部分数据丢失乱序问题
- 搭建cordova环境重要注意事项
- ss