websocket所需要的依赖
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
后台代码:
package com.cosmosource.controller.websocket;
import com.cosmosource.core.utils.GetSessionStatementUtil;
import com.cosmosource.core.utils.GetSessionStatusUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
/**
-
@ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
-
注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@ServerEndpoint("/websocket")
public class WebSocketTest {private static Logger logger = LoggerFactory.getLogger(WebSocketTest.class);
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;/**
- 连接建立成功调用的方法
- @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
//加入set中
webSocketSet.add(this);
//在线数加1
addOnlineCount();
// System.out.println(“有新连接加入!当前在线人数为” + getOnlineCount());
logger.info("[onOpen] 有新连接加入!当前在线人数为[{}]", getOnlineCount());
}
/**
- 连接关闭调用的方法
*/
@OnClose
public void onClose() {
//从set中删除
webSocketSet.remove(this);
//在线数减1
subOnlineCount();
// System.out.println(“有一连接关闭!当前在线人数为” + getOnlineCount());
logger.info("[onClose] 有一连接关闭!当前在线人数为[{}]", getOnlineCount());
}
/**
- 收到客户端消息后调用的方法
- @param message 客户端发送过来的消息
- @param session 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) {
// System.out.println(“来自客户端的消息:” + message);
logger.info("[onMessage] 来自客户端的消息:[{}]", message);
//群发消息
for (WebSocketTest item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
// e.printStackTrace();
logger.error("[onMessage] error", e);
continue;
}
}
}
/**
- 发生错误时调用
- @param session
- @param error
*/
@OnError
public void onError(Session session, Throwable error) {
// System.out.println(“发生错误”);
logger.info("[onError] 发生错误 error=[{}]", error);
// error.printStackTrace();
}
/**
-
这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
-
@param message
-
@throws IOException
*/
public void sendMessage(String message) throws IOException {
//if(!“undefined”.equalsIgnoreCase(message)){
if (!message.contains("")) {
String sessionStatus = GetSessionStatusUtil.getSessionStatus(message);
// this.session.getBasicRemote().sendText(message);
this.session.getBasicRemote().sendText(sessionStatus);
//this.session.getAsyncRemote().sendText(message);
} else {
String sessionId = message.substring(0, message.lastIndexOf(""));
String statementId = message.substring(message.lastIndexOf("_") + 1);String resultStatus = GetSessionStatementUtil.getSessionStatement(sessionId, statementId); this.session.getBasicRemote().sendText(resultStatus);
}
//}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}public static synchronized void addOnlineCount() {
WebSocketTest.onlineCount++;
}public static synchronized void subOnlineCount() {
WebSocketTest.onlineCount–;
}
}
对象 操作响应时对应取得值
package com.cosmosource.controller.websocket;
import java.io.Serializable;
public class ResultModel implements Serializable {
/**
* 操作成功的响应码
* */
public static int RESULT_OK = 0;
/**
* 操作失败的响应码
* */
public static int RESULT_FAILURE = 1;
/**
* 为客户端做toast提示专用
* */
public static int TOAST_PROMPT = 10;
/**
* 用户token错误码
* */
public static int TOKEN_ERROR = -1;
/**
* 参数错误码
* */
public static int PARAM_ERROR = -2;
/**
* 群成员人数不足
* */
public static int GROUP_MEMBER_ERROR = -3;
/**
* 含有敏感词
* */
public static int GROUP_SENSITIVE = -4;
/**
* 面对面建群超时
* */
public static int FACE_GROUP_TIMEOUT = -5;
/**
* 表情数超额
* */
public static int EXPRESSION_ERROR = -6;
/**
* 表情已在表情库中
* */
public static int EXPRESSION_EXIST_ERROR = -7;
/**
* 表情格式有误
* */
public static int EXPRESSION_SUFFIX_ERROR = -8;
private static final long serialVersionUID = 13489783434L;
private String message;
/**
* 返回码
* */
private int code;
/**
* 返回数据(请求错误时,返回错误信息)
* */
private T data;
public ResultModel() {
}
public ResultModel(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
工具类:
package com.cosmosource.core.utils;
//import com.cosmosource.controller.livy.LivyController;
import com.cosmosource.config.Config;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.utils.HttpClientUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
public class GetSessionStatusUtil {
/**
* 读取IDP配置
/
private static Config config = new Config(“com.config”);
/*
* 机器学习 hsot userName passWord
*/
private static String livyUrl = config.getValue(“livy_url”);
private static Logger logger = LoggerFactory.getLogger(GetSessionStatusUtil.class);
// private String livyUrl = “http://192.168.0.152:9999/”;
//private static String livyUrl = “http://192.168.0.152:9998/”;
public static String getSessionStatus(String sessionId) {
//返回结果
Map<String, String> resultMap = new HashMap<String, String>();
//livy请求url(需附件参数)
String postUrl = null;
//livy接口
String url = livyUrl;
// HashMap<String, String> parmaMap = (HashMap<String, String>) consoleParma.getParma();
//方法名字
// String sessionId = parmaMap.get(“sessionId”);
try {
if (StringUtils.isBlank(sessionId)) {
logger.error("[getSessionStatus] 获取session的状态失败,sessionId=[{}]", sessionId);
return null;
// return new ResultModel(ResultModel.PARAM_ERROR, “参数错误”, new HashMap<>());
}
String method = “sessions/” + sessionId + “/state”;
postUrl = url + method;
HttpClientUtil httpClientUtil = new HttpClientUtil();
resultMap = httpClientUtil.getRest(postUrl);
String sessionStatus = resultMap.get(“state”);
logger.info("[getSessionStatus] 获取session的状态成功,sessionId=[{}]", sessionId);
return sessionStatus;
// return new ResultModel(ResultModel.RESULT_OK, “获取session的状态成功”, resultMap);
} catch (Exception e) {
logger.error("[getSessionStatus] 获取session的状态失败,sessionId=[{}]", sessionId);
return null;
// return new ResultModel(ResultModel.PARAM_ERROR, “参数错误”, new HashMap<>());
}
}
}
工具类:
package com.cosmosource.core.utils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
-
@Description: 获取远程服务器 获取需要的状态
-
@Author: 王笑天
-
@CreateDate: 2019/5/13 14:41
-
@UpdateUser: 王笑天
-
@UpdateDate: 2019/5/13 14:41
-
@UpdateRemark: 修改内容
-
@Version: 1.0
/
public class HttpClientUtil {
/
public String doPost(String url, Map<String,String> map, String charset){
CloseableHttpClient httpClient = null;
HttpPost httpPost = null;
String result = null;
try{
httpClient = HttpClients.createDefault();
httpPost = new HttpPost(url);
//设置参数
List list = new ArrayList();
Iterator iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> elem = (Map.Entry<String, String>) iterator.next();
list.add(new BasicNameValuePair(elem.getKey(),elem.getValue()));
}
if(list.size() > 0){
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,charset);
httpPost.setEntity(entity);
}
HttpResponse response = httpClient.execute(httpPost);
if(response != null){
HttpEntity resEntity = response.getEntity();
if(resEntity != null){
result = EntityUtils.toString(resEntity,charset);
}
}
}catch(Exception ex){
ex.printStackTrace();
}
return result;
}
*//**
- @Author 王笑天
- @Description
- @Date 2019/5/13 14:45
- @Param
- @return
- @Throws
**/
public Map postRest(String url,Map paramMap) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
RestTemplate restTemplate = new RestTemplate();
List messageConverters=new ArrayList();
messageConverters.add(new SourceHttpMessageConverter());
messageConverters.add(new FormHttpMessageConverter());
messageConverters.add(new MappingJackson2HttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
Map forObject = restTemplate.postForObject(url,paramMap,Map.class);
return forObject;
}
/**
- @Author 王笑天
- @Description 删除session
- @Date 2019/5/13 14:45
- @Param
- @return
- @Throws
**/
public void deleteRest(String url,Map paramMap) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
RestTemplate restTemplate = new RestTemplate();
List messageConverters=new ArrayList();
messageConverters.add(new SourceHttpMessageConverter());
messageConverters.add(new FormHttpMessageConverter());
messageConverters.add(new MappingJackson2HttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
restTemplate.delete(url);
}
/**
-
@Author 王笑天
-
@Description 获取session状态
-
@Date 2019/5/13 14:44
-
@Param
-
@return
-
@Throws
**/
public Map getRest(String url) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
RestTemplate restTemplate = new RestTemplate();List messageConverters=new ArrayList();
messageConverters.add(new SourceHttpMessageConverter());
messageConverters.add(new FormHttpMessageConverter());
messageConverters.add(new MappingJackson2HttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
Map forObject = restTemplate.getForObject(url,Map.class);return forObject;
}
}
工具类:
package com.cosmosource.core.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
public class GetSessionStatementUtil {
private static Logger logger = LoggerFactory.getLogger(GetSessionStatementUtil.class);
private static String livyUrl = “http://192.168.0.152:9998/”;
public static String getSessionStatement(String sessionId,String statementId) {
//返回结果
Map<String, String> resultMap = new HashMap<String, String>();
//livy请求url(需附件参数)
String postUrl = null;
//livy接口
String url = livyUrl;
// HashMap<String, String> parmaMap = (HashMap<String, String>) consoleParma.getParma();
try {
// String sessionId = parmaMap.get(“sessionId”);
// String statementId = parmaMap.get(“statementId”);
//方法名字
String method = “sessions/” + sessionId + “/statements/” + statementId;
postUrl = url + method;
HttpClientUtil httpClientUtil = new HttpClientUtil();
resultMap = httpClientUtil.getRest(postUrl);
String resultState=resultMap.get(“state”);
logger.info("[getSessionStatement] 获取session的statement结果成功,sessionId=[{}],statementId=[{}]", sessionId,statementId);
// return new ResultModel(ResultModel.RESULT_OK, “获取session的statement结果成功”, resultMap);
return resultState;
} catch (Exception e) {
logger.error("[getSessionStatement] 获取session的statement结果失败,sessionId=[{}],statementId=[{}]", sessionId,statementId);
// return new ResultModel(ResultModel.RESULT_FAILURE, “获取session的statement结果失败”, new HashMap<>());
return null;
}
}
}
前台代码:
function getSessionStateWebsocket() {
debugger
var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
websocket = new WebSocket("ws://localhost:8089/gdm/websocket");
//websocket = new WebSocket("ws://"+IPandPortPath.toString()+"/gdm/websocket");
}
else {
// alert('当前浏览器 Not support websocket');
// Ext.Msg.alert('提示', '当前浏览器 Not support websocket!', Ext.emptyFn);
setMessageInnerHTML("当前浏览器 Not support websocket!");
}
//连接发生错误的回调方法
websocket.onerror = function () {
setMessageInnerHTML("WebSocket连接发生错误");
};
//连接成功建立的回调方法
websocket.onopen = function () {
// setMessageInnerHTML("WebSocket连接成功");
send();
};
//接收到消息的回调方法
websocket.onmessage = function (event) {
// alert(event.data);
if (event.data == "idle") {
sessionState = "idle";
closeWebSocket();
//少个函数么?
//getResult();
// document.getElementById("but-run").setAttribute("disabled", true);
// document.getElementById("but-run").removeAttribute("disabled");
} else {
// closeWebSocket();
send();
}
//setMessageInnerHTML(event.data);
};
//连接关闭的回调方法
websocket.onclose = function () {
// setMessageInnerHTML("WebSocket连接关闭");
};
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocket();
};
//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
// document.getElementById('message').innerHTML += innerHTML + '<br/>';
Ext.Msg.alert('提示', innerHTML, Ext.emptyFn);
// alert(innerHTML);
// alert("123");
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//发送消息
function send() {
//var message = document.getElementById('text').value;
var message = sessionId;
websocket.send(message);
}
}
function getResultStateWebsocket() {
var websocketresult = null;
//判断当前浏览器是否支持WebSocket
if (‘WebSocket’ in window) {
websocketresult = new WebSocket(“ws://localhost:8089/gdm/websocket”);
//websocketresult = new WebSocket(“ws://”+IPandPortPath.toString()+"/gdm/websocket");
}
else {
// alert(‘当前浏览器 Not support websocket’);
// Ext.Msg.alert(‘提示’, ‘当前浏览器 Not support websocket!’, Ext.emptyFn);
setMessageInnerHTMLResult(“当前浏览器 Not support websocket!”);
}
//连接发生错误的回调方法
websocketresult.onerror = function () {
setMessageInnerHTMLResult("WebSocket连接发生错误");
};
//连接成功建立的回调方法
websocketresult.onopen = function () {
// setMessageInnerHTML("WebSocket连接成功");
// send();
sendResult();
};
//接收到消息的回调方法
websocketresult.onmessage = function (event) {
// alert(event.data);
if (event.data == "available") {
// sessionState ="idle";
closeWebSocketResult();
testResult();
//document.getElementById("but-run").setAttribute("disabled", true);
// document.getElementById("but-run").removeAttribute("disabled");
} else {
// closeWebSocket();
sendResult();
}
//setMessageInnerHTML(event.data);
};
//连接关闭的回调方法
websocketresult.onclose = function () {
// setMessageInnerHTML("WebSocket连接关闭");
};
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocketResult();
};
//将消息显示在网页上
function setMessageInnerHTMLResult(innerHTML) {
// document.getElementById('message').innerHTML += innerHTML + '<br/>';
Ext.Msg.alert('提示', innerHTML, Ext.emptyFn);
// alert(innerHTML);
// alert("123");
}
//关闭WebSocket连接
function closeWebSocketResult() {
websocketresult.close();
}
//发送消息
function sendResult() {
//var message = document.getElementById('text').value;
var message = sessionId + "_" + statementId;
websocketresult.send(message);
}
function testResult() {
Ext.Ajax.request({
async: false,
method: "POST",
url: "/gdm/livy/getSessionStatement",
defaultPostHeader: "application/json;charset=utf-8",
params:
//sql:"select * from default.tbs_20w limit 5;"
//sql:JSON.stringify(ediotrContent)
JSON.stringify({
"parma": {
"sessionId": JSON.stringify(sessionId),
"statementId": JSON.stringify(statementId)
}
})
//parma:{sql:JSON.stringify(ediotrContent)}
,
success: function (response, opts) {
//按钮可点击
$('#but-run').attr("disabled", false);
var data = Ext.decode(response.responseText);
var resultList2 = data.data;
// var sessionId=resultList.id;
//sessionState=resultList.state;
//statementId = resultList.id;
$('#longMsimg').css({
display: 'none'
})
//Ext.Msg.alert(resultList);
// alert(JSON.stringify(resultList));
// var con3 = resultList;
var con3 = JSON.stringify(resultList2);
// console.log(con3);
var history = document.getElementById("runHistory");
history.innerHTML = con3
// runHistory();
},
failure: function (response, opts) {
Ext.Msg.alert('提示', '获取session的statement结果失败!', Ext.emptyFn);
}
});
}
}