手术聊天室

This commit is contained in:
zhaoyz 2024-03-22 17:33:28 +08:00
parent e17f93d517
commit 223951964b
7 changed files with 127 additions and 20 deletions

View File

@ -19,18 +19,18 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/rax/chat", "/rax/ai-medicine", "/rax/doctor-medicine", "/rax/vital-signs", "/rax/SurgeryData")
registry.addEndpoint("/rax/chat", "/rax/SurgeryData")
.setAllowedOrigins("*");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
long [] heartbeat = {10000, 5000};
ThreadPoolTaskScheduler te = new ThreadPoolTaskScheduler();
te.setPoolSize(1);
te.setThreadNamePrefix("wss-heartbeat-thread-");
te.initialize();
registry.enableSimpleBroker("/topic").setTaskScheduler(te).setHeartbeatValue(heartbeat);
// 第一个值表示客户端发送心跳消息的间隔时间第二个值表示服务端发送心跳消息的间隔时间
long [] heartbeat = {60000, 60000};
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
registry.enableSimpleBroker("/topic").setTaskScheduler(threadPoolTaskScheduler).setHeartbeatValue(heartbeat);
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/front");
registry.setUserDestinationPrefix("/topic/user");
}

View File

@ -57,7 +57,7 @@ public class MongoDBSource {
// 允许的最大连接数
builder.maxSize(120);
// 最小连接数
builder.minSize(10);
builder.minSize(1);
// 池连接可以存活的最长时间零值表示寿命没有限制超过其生命周期的池连接将被关闭并在必要时由新连接替换
builder.maxConnectionLifeTime(0, TimeUnit.SECONDS);
// 池连接的最大空闲时间零值表示对空闲时间没有限制超过其空闲时间的池连接将被关闭并在必要时由新连接替换

View File

@ -1,5 +1,6 @@
package com.rax.vital.interceptor;
import com.rax.vital.medicine.service.ChatService;
import com.rax.vital.timer.VitalSignTimer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -26,6 +27,9 @@ public class WSChannelInterceptor implements ChannelInterceptor {
@Autowired
private VitalSignTimer vitalSignTimer;
@Autowired
private ChatService chatService;
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
@ -53,6 +57,7 @@ public class WSChannelInterceptor implements ChannelInterceptor {
|| StompCommand.UNSUBSCRIBE.equals(accessor.getCommand())) {
String simpSessionId = (String) accessor.getHeader("simpSessionId");
vitalSignTimer.stopTimerTaskMongo(simpSessionId);
chatService.stopTimerTaskMongo(simpSessionId);
}
}
return message;

View File

@ -0,0 +1,38 @@
package com.rax.vital.medicine.controller;
import com.alibaba.fastjson.JSONObject;
import com.rax.vital.medicine.service.ChatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
import org.springframework.stereotype.Controller;
@Controller
public class ChatController {
@Autowired
private ChatService chatService;
@Autowired
private OAuth2AuthorizationService authorizationService;
@MessageMapping("/sendMessage")
public void sendMessage(MessageHeaders messageHeaders, String body) {
JSONObject params = JSONObject.parseObject(body);
OAuth2Authorization authorization = authorizationService.findByToken(params.getString("token"), OAuth2TokenType.ACCESS_TOKEN);
if (authorization != null) {
String username = authorization.getPrincipalName();
String simpSessionId = messageHeaders.get("simpSessionId", String.class);
String db = params.getString("db");
String msg = params.getString("msg");
chatService.sendMessage(db, username, simpSessionId, msg);
} else {
throw new AccessDeniedException("Access is denied");
}
}
}

View File

@ -1,8 +1,6 @@
package com.rax.vital.medicine.controller;
import com.alibaba.fastjson.JSONObject;
import com.rax.vital.medicine.service.AIMedicineService;
import com.rax.vital.medicine.service.DoctorMedicineService;
import com.rax.vital.timer.VitalSignTimer;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -14,26 +12,18 @@ import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.stereotype.Controller;
/**
* 用药
*
* @date 2024.2.19
*/
@RestController
@RequestMapping("/medicine")
@Controller
@Tag(description = "medicine", name = "人工和AI用药管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class MedicineController {
@Autowired
private AIMedicineService aiMedicineService;
@Autowired
private DoctorMedicineService doctorMedicineService;
@Autowired
private VitalSignTimer vitalSignTimer;

View File

@ -0,0 +1,7 @@
package com.rax.vital.medicine.service;
public interface ChatService {
void sendMessage(String db, String username, String simpSessionId, String msg);
void stopTimerTaskMongo(String simpSessionId);
}

View File

@ -0,0 +1,67 @@
package com.rax.vital.medicine.service.impl;
import cn.hutool.core.date.DateUtil;
import com.rax.vital.datasource.MongoDBSource;
import com.rax.vital.medicine.service.ChatService;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@RefreshScope
@Service
public class ChatServiceImpl implements ChatService {
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
private static final Map<String, MongoDBSource> datasourceMap = new HashMap<>(100);
// MongoDB的地址
@Value("${vital-sign.mongodb.host}")
private String mongoDBHost;
// MongoDB的用户名
@Value("${vital-sign.mongodb.username}")
private String mongoUsername;
// MongoDB的用户的密码
@Value("${vital-sign.mongodb.password}")
private String mongoPassword;
@Override
public void sendMessage(String db, String username, String simpSessionId, String msg) {
MongoDBSource mongoDBSource = datasourceMap.get(simpSessionId);
if (mongoDBSource == null) {
mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, db);
datasourceMap.put(simpSessionId, mongoDBSource);
mongoDBSource.open();
}
MongoTemplate template = mongoDBSource.getTemplate();
Document document = new Document();
document.put("content", msg);
document.put("create_time", DateUtil.now());
document.put("create_user", username);
document.put("deleted", 0);
document.put("revoked", 0);
template.insert(document, "t_chat");
simpMessagingTemplate.convertAndSendToUser(db, "/chatroomMessage", document);
}
@Override
public synchronized void stopTimerTaskMongo(String simpSessionId) {
MongoDBSource mongoDBSource = datasourceMap.get(simpSessionId);
if (mongoDBSource != null) {
mongoDBSource.close();
datasourceMap.remove(simpSessionId);
}
}
}