跳到主要内容

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;
}

}