package com.rax.vital.timer; import com.rax.common.security.util.SecurityUtils; import com.rax.vital.datasource.MongoDBSource; import com.rax.vital.medicine.service.VitalSignsService; import lombok.RequiredArgsConstructor; 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.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; import java.util.*; /** * 生命体征和用药信息推送 * * @author zhaoyz * @date 2024/2/29 */ @RefreshScope @Component @RequiredArgsConstructor public class VitalSignTimer { private final SimpMessagingTemplate simpMessagingTemplate; private final VitalSignsService vitalSignsService; // 定时任务容器 private static final Map timerTaskMap = new HashMap<>(300); // mongoDB链接工具类容器 private static final Map mongoDBSourceMap = new HashMap<>(300); // MongoDB的地址 @Value("${vital-sign.mongodb.host}") private String mongoDBHost; // MongoDB的用户名 @Value("${vital-sign.mongodb.username}") private String username; // MongoDB的用户的密码 @Value("${vital-sign.mongodb.password}") private String password; /** * 根据当前用户和患者数据库进行查询生命体征和用药信息并推送 * * @author zhaoyz */ public void createAndSendMessage(String database) { String account = SecurityUtils.getUser().getUsername(); TimerTask task = timerTaskMap.get(account + "-" + database); if (task != null) { return; } MongoDBSource mongoDBSource = mongoDBSourceMap.get(database); if (mongoDBSource == null) { mongoDBSource = new MongoDBSource(mongoDBHost, password, username, database); mongoDBSourceMap.put(database, mongoDBSource); mongoDBSource.increaseCount(); } MongoDBSource finalMongoDBSource = mongoDBSource; TimerTask timerTask = new TimerTask() { @Override public void run() { List vitalSignsList = vitalSignsService.getVitalSignsList(finalMongoDBSource); HashMap result = new HashMap(); result.put("vitalSignsList", vitalSignsList); simpMessagingTemplate.convertAndSendToUser(account, "/doctorMedicine", vitalSignsList); } }; // 定时任务,设置1秒 Timer timer = new Timer(); timer.schedule(timerTask, 0, 1000); timerTaskMap.put(account + "-" + database, timerTask); } /** * 停止指定的某个用户查询的患者数据库定时器 * * @param database * @param user * @author zhaoyz */ public synchronized void stopTimerTask(String database, String user) { TimerTask timerTask = timerTaskMap.get(user + "-" + database); if (timerTask != null) { timerTask.cancel(); timerTaskMap.remove(user + "-" + database); MongoDBSource mongoDBSource = mongoDBSourceMap.get(database); mongoDBSource.decreaseCount(); int count = mongoDBSource.getCount(); if (count == 0) { mongoDBSource.close(); mongoDBSourceMap.remove(database); } } } }