websocket
1.新增数据集
- 点击
数据集管理
或者数据
中数据集后的均可打开数据集管理界面
- 点击
“新增分组”
可添加分组信息;点击“新增数据集”
可添加数据集信息
2.新增分组
输入分组名称,添加即可
3.新增数据源
数据集名称:可随意输入
分组:选择分组信息
数据类型:选择Websocket
4配置接口地址
在接口地址一栏填写我们制作的接口地址,并点击刷新应用接口,如下图
接口地址示例:ws://localhost:8080/jeecg-boot/websocket/drag
https使用wss
5编写WebSocket服务端
示例代码如下: 示例中使用了(redis订阅发布)机制解决消息集群问题
package org.jeecg.modules.drag.config.websocket;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.annotation.Resource;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.base.BaseMap;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.constant.WebsocketConst;
import org.jeecg.common.modules.redis.client.JeecgRedisClient;
import org.jeecg.common.modules.redis.listener.JeecgRedisListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
/**
* 拖拽websocket服务端
*
* @author zyf
*/
@Component
@Slf4j
@ServerEndpoint("/websocket/drag/{chartId}")
public class DragWebSocket {
/**线程安全Map*/
private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
/**
* redis队列名称
*/
public static final String REDIS_TOPIC_NAME = "dragSocketHandler";
@Autowired
private JeecgRedisClient jeecgRedisClient;
@OnOpen
public void onOpen(Session session, @PathParam(value = "chartId") String chartId) {
try {
sessionPool.put(chartId, session);
log.debug("【仪表盘 WebSocket】有新的连接,总数为:" + sessionPool.size());
} catch (Exception e) {
}
}
@OnClose
public void onClose(@PathParam("chartId") String chartId) {
try {
sessionPool.remove(chartId);
log.debug("【仪表盘 WebSocket】连接断开,总数为:" + sessionPool.size());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* ws推送消息
*
* @param chartId
* @param message
*/
public void pushMessage(String chartId, String message) {
for (Map.Entry<String, Session> item : sessionPool.entrySet()) {
if (item.getKey().contains(chartId)) {
Session session = item.getValue();
try {
synchronized (session){
log.debug("【仪表盘 WebSocket】推送单人消息:" + message);
session.getBasicRemote().sendText(message);
}
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
}
}
@OnMessage
public void onMessage(String message) {
if(!"ping".equals(message) && !WebsocketConst.CMD_CHECK.equals(message)){
log.debug("【仪表盘 WebSocket】收到客户端消息:" + message);
}else{
log.debug("【仪表盘 WebSocket】收到客户端消息:" + message);
}
}
/**
* 配置错误信息处理
*
* @param session
* @param t
*/
@OnError
public void onError(Session session, Throwable t) {
log.warn("【仪表盘 WebSocket】消息出现错误");
t.printStackTrace();
}
/**
* 此为单点消息
*
* @param chartId
* @param message
*/
public void sendMessage(String chartId, String message) {
BaseMap baseMap = new BaseMap();
baseMap.put("chartId", chartId);
baseMap.put("message", message);
jeecgRedisClient.sendMessage(DragWebSocket.REDIS_TOPIC_NAME, baseMap);
}
@Component(REDIS_TOPIC_NAME)
class RedisSocketHandler implements JeecgRedisListener {
private final DragWebSocket dragWebSocket;
private RedisSocketHandler(DragWebSocket dragWebSocket) {
this.dragWebSocket = dragWebSocket;
}
@Override
public void onMessage(BaseMap map) {
log.debug("【仪表盘 WebSocket】redis {},参数:{}", REDIS_TOPIC_NAME, map.toString());
String chartId = map.get("chartId");
String message = map.get("message");
dragWebSocket.pushMessage(chartId, message);
}
}
}
6编写消息推送测试方法
package org.jeecg.modules.drag.controller;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.drag.config.websocket.DragWebSocket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试拖拽websocket接口
*
* @author zyf
*/
@RestController
@Api(tags = "拖拽WebSocket测试")
@RequestMapping("/drag/websocket")
public class DragWebSocketController {
@Autowired
private DragWebSocket webSocket;
@PostMapping("/sendData")
@ApiOperation(value = "测试拖拽组件更新", notes = "测试拖拽组件更新")
public Result<String> sendData() {
Result<String> result = new Result<>();
//需要推送数据的组件ID
String chartId = "cfb9bb9a-5d4d-4cd0-9d2e-fb9e2be1fc92";
String message = "[{\"value\":1048,\"name\":\"波导\"},{\"value\":735,\"name\":\"oppo\"},{\"value\":580,\"name\":\"华为\"},{\"value\":484,\"name\":\"小米\"},{\"value\":300,\"name\":\"魅族\"}]";
JSONObject obj = new JSONObject();
obj.put("chartId", chartId);
obj.put("result", message);
webSocket.sendMessage(chartId, obj.toJSONString());
result.setResult("单发");
return result;
}
}