|
@@ -2,6 +2,8 @@ package org.springblade.websocket.service;
|
|
|
|
|
|
import io.undertow.websockets.jsr.UndertowSession;
|
|
import io.undertow.websockets.jsr.UndertowSession;
|
|
import lombok.Data;
|
|
import lombok.Data;
|
|
|
|
+import org.codehaus.jackson.JsonProcessingException;
|
|
|
|
+import org.codehaus.jackson.map.ObjectMapper;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springblade.business.feign.BusinessWebSocketClient;
|
|
import org.springblade.business.feign.BusinessWebSocketClient;
|
|
@@ -14,6 +16,7 @@ import org.springblade.feign.ArchiveWebSocketClient;
|
|
import org.springblade.manager.feign.ManagerWebSocketClient;
|
|
import org.springblade.manager.feign.ManagerWebSocketClient;
|
|
import org.springblade.meter.feign.MeterWebSocketClient;
|
|
import org.springblade.meter.feign.MeterWebSocketClient;
|
|
import org.springblade.websocket.entity.WebSocketClientInfo;
|
|
import org.springblade.websocket.entity.WebSocketClientInfo;
|
|
|
|
+import org.springblade.websocket.vo.DingDingMsg;
|
|
import org.springblade.websocket.vo.MsgVO;
|
|
import org.springblade.websocket.vo.MsgVO;
|
|
import org.springblade.websocket.vo.SystMsgVO;
|
|
import org.springblade.websocket.vo.SystMsgVO;
|
|
import org.springblade.websocket.vo.UserInfoVO;
|
|
import org.springblade.websocket.vo.UserInfoVO;
|
|
@@ -49,6 +52,8 @@ public class WebSocketService implements ApplicationContextAware {
|
|
/** 后台*/
|
|
/** 后台*/
|
|
private static ManagerWebSocketClient managerWebSocketClient;
|
|
private static ManagerWebSocketClient managerWebSocketClient;
|
|
|
|
|
|
|
|
+ private static final ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|
WebSocketService.meterWebSocketClient = applicationContext.getBean(MeterWebSocketClient.class);
|
|
WebSocketService.meterWebSocketClient = applicationContext.getBean(MeterWebSocketClient.class);
|
|
@@ -77,6 +82,8 @@ public class WebSocketService implements ApplicationContextAware {
|
|
private static Set<Session> clientSystemSessions = new CopyOnWriteArraySet<>();
|
|
private static Set<Session> clientSystemSessions = new CopyOnWriteArraySet<>();
|
|
/** 档案系统session集合*/
|
|
/** 档案系统session集合*/
|
|
private static Set<Session> archivesSystemSessions = new CopyOnWriteArraySet<>();
|
|
private static Set<Session> archivesSystemSessions = new CopyOnWriteArraySet<>();
|
|
|
|
+ /** 档案系统session集合*/
|
|
|
|
+ private static Set<Session> dingdingSystemSessions = new CopyOnWriteArraySet<>();
|
|
|
|
|
|
// /** 更新公告推送记录*/
|
|
// /** 更新公告推送记录*/
|
|
// private static Set<UserSingleVO> updateMsgPushUsers = new HashSet<>();
|
|
// private static Set<UserSingleVO> updateMsgPushUsers = new HashSet<>();
|
|
@@ -157,6 +164,9 @@ public class WebSocketService implements ApplicationContextAware {
|
|
case ClientIdConstant.CLIENT_ID:
|
|
case ClientIdConstant.CLIENT_ID:
|
|
clientSystemSessions.add(session);
|
|
clientSystemSessions.add(session);
|
|
break;
|
|
break;
|
|
|
|
+ case ClientIdConstant.DINGDING_ID:
|
|
|
|
+ dingdingSystemSessions.add(session);
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
log.error("未知的系统登录:"+system);
|
|
log.error("未知的系统登录:"+system);
|
|
}
|
|
}
|
|
@@ -187,6 +197,9 @@ public class WebSocketService implements ApplicationContextAware {
|
|
case ClientIdConstant.ARCHIVE_ID:
|
|
case ClientIdConstant.ARCHIVE_ID:
|
|
archivesSystemSessions.remove(session);
|
|
archivesSystemSessions.remove(session);
|
|
break;
|
|
break;
|
|
|
|
+ case ClientIdConstant.DINGDING_ID:
|
|
|
|
+ dingdingSystemSessions.remove(session);
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
log.error("未知的系统退出:"+system);
|
|
log.error("未知的系统退出:"+system);
|
|
}
|
|
}
|
|
@@ -419,12 +432,35 @@ public class WebSocketService implements ApplicationContextAware {
|
|
* 导致通道关闭,但是数组中使用的是快照,还存在这个连接,此时跳过推送给这个窗口*/
|
|
* 导致通道关闭,但是数组中使用的是快照,还存在这个连接,此时跳过推送给这个窗口*/
|
|
if (basicRemote != null){
|
|
if (basicRemote != null){
|
|
try {
|
|
try {
|
|
- basicRemote.sendText(vo.getMsg());
|
|
|
|
- } catch (IOException e) {
|
|
|
|
|
|
+ DingDingMsg dingMsg = new DingDingMsg();
|
|
|
|
+ dingMsg.setMsgType(vo.getMsgType());
|
|
|
|
+ dingMsg.setData(vo.getObject());
|
|
|
|
+ // 将对象序列化为JSON字符串再发送
|
|
|
|
+ String message = toJsonMessage(R.data(dingMsg));
|
|
|
|
+ basicRemote.sendText(message);
|
|
|
|
+ } catch (Exception e) {
|
|
log.error(vo.getUserId()+"推送消息失败,消息内容["+ vo.getMsg()+"],原因:"+e.getMessage());
|
|
log.error(vo.getUserId()+"推送消息失败,消息内容["+ vo.getMsg()+"],原因:"+e.getMessage());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ public static String toJsonMessage(Object object) {
|
|
|
|
+ if (object == null) {
|
|
|
|
+ return "";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (object instanceof String) {
|
|
|
|
+ return (String) object;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ return objectMapper.writeValueAsString(object);
|
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
|
+ log.error("对象序列化为JSON失败: {}", e.getMessage());
|
|
|
|
+ return object.toString();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|