whycxzp
2025-03-26 7caa838a2252ffedbc7437de963f2495819fcb1a
东峰接口
1个文件已修改
9个文件已添加
557 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/DfxtDeviceListController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/DfxtDeviceDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/listener/TaskListener.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/DfxtBmsStateMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/DfxtDeviceListMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/DfxtBmsState.java 296 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/DfxtDeviceList.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/DfxtBmsStateService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/DfxtDeviceListService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/webSocket/DfxtBmsStateSocket.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/DfxtDeviceListController.java
New file
@@ -0,0 +1,28 @@
package com.whyc.controller;
import com.whyc.dto.DfxtDeviceDTO;
import com.whyc.dto.Response;
import com.whyc.pojo.DfxtDeviceList;
import com.whyc.service.DfxtDeviceListService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@Api(tags = "东峰系统所有设备列表")
@RequestMapping("dfxtDeviceList")
public class DfxtDeviceListController {
    @Autowired
    private DfxtDeviceListService service;
    @GetMapping("getDeviceList")
    public Response<List<DfxtDeviceDTO>> getDeviceList() {
        return service.getDeviceList();
    }
}
src/main/java/com/whyc/dto/DfxtDeviceDTO.java
New file
@@ -0,0 +1,16 @@
package com.whyc.dto;
import lombok.Data;
import lombok.ToString;
@ToString
@Data
public class DfxtDeviceDTO {
    private String deviceId;
    private String deviceName;
    private Boolean isUsed;
}
src/main/java/com/whyc/listener/TaskListener.java
@@ -53,7 +53,7 @@
        instance.set(Calendar.SECOND,59);
        Date firstDate = instance.getTime();*/
        timer = new Timer("Task定时任务",true);
        timer.schedule(processSurveyTask,0,1000);
        //timer.schedule(processSurveyTask,0,1000);
        /*//黑河多宝山和北安 站点专用
        timer.schedule(heiHeDataTask,0,4000);*/
        /*//每月刷新数据库表中天气支持城市-聚合平台,弃用
@@ -76,9 +76,9 @@
        /*if(YamlProperties.messageSwitch.toUpperCase().equals("ON")){
            timer.schedule(new AlarmMessageTask2(),1000*10,1000*10);
        }*/
        timer.schedule(licenseTask,1000,60000);
        //timer.schedule(licenseTask,1000,60000);
        //账号登录失败锁定解锁相关策略,频率为2秒
        timer.schedule(accountLockStrategyTask, 1000, 2000);
        //timer.schedule(accountLockStrategyTask, 1000, 2000);
        if(YamlProperties.systemType == 2) {
            //账号自动扫描策略,频率为1天
            timer.schedule(accountScanTask, 1000, ONE_DAY);
src/main/java/com/whyc/mapper/DfxtBmsStateMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.DfxtBmsState;
public interface DfxtBmsStateMapper extends CustomMapper<DfxtBmsState>{
}
src/main/java/com/whyc/mapper/DfxtDeviceListMapper.java
New file
@@ -0,0 +1,14 @@
package com.whyc.mapper;
import com.whyc.dto.DfxtDeviceDTO;
import com.whyc.pojo.DfxtDeviceList;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface DfxtDeviceListMapper extends CustomMapper<DfxtDeviceList>{
    @Select("SELECT DISTINCT d.objectid as deviceId, d.fullname as deviceName, EXISTS(SELECT 1 FROM db_battinf.tb_battinf b WHERE d.objectid = b.DeviceId) AS isUsed\n" +
            "FROM db_ram_db.tb_dfxt_devicelist d;")
    List<DfxtDeviceDTO> getDeviceList();
}
src/main/java/com/whyc/pojo/DfxtBmsState.java
New file
@@ -0,0 +1,296 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
 * 东峰系统BMS实时数据信息表
 */
@Data
@TableName(schema = "db_ram_db",value = "tb_dfxt_bms_state")
public class DfxtBmsState {
    @TableId(type = IdType.AUTO, value = "num")
    //bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    private  Long num;
    //   int(11) NOT NULL DEFAULT '1' COMMENT '设备ID',
    @TableField("dev_id")
    private  Integer dev_id;
    // datetime NOT NULL  COMMENT '更新时间[从平台获取数据更新时间]',
    @TableField("record_time")
    private Date record_time;
    //  int(11) NOT NULL DEFAULT '0' COMMENT '电池类型',
    @TableField("battery_type")
    private  Integer battery_type;
    // int(11) NOT NULL DEFAULT '0' COMMENT '电池串数',
    private  Integer bcst;
    // float(11,0) NOT NULL DEFAULT '0' COMMENT '单体充电保护电压',
    private  Float cpbv;
    // float(11,0) NOT NULL DEFAULT '0' COMMENT '单体充电恢复电压',
    private  Float srbv;
    // float(11,0) NOT NULL DEFAULT '0' COMMENT '单体放电保护电压',
    private  Float dpbv;
    // float(11,0) NOT NULL DEFAULT '0' COMMENT '单体放电恢复电压',
    private  Float drbv;
    // float(11,0) NOT NULL DEFAULT '0' COMMENT '单节压差保护电压',
    private  Float sspv;
    //  float NOT NULL DEFAULT '0' COMMENT '总充电保护电压',
    private  Float acpbv;
    //  float(11,0) NOT NULL DEFAULT '0' COMMENT '总充电恢复电压',
    private  Float asrbv;
    //  float NOT NULL DEFAULT '0' COMMENT '总放电保护电压',
    private  Float adpbv;
    //  float NOT NULL DEFAULT '0' COMMENT '总放电恢复电压',
    private  Float adrbv;
    //  float NOT NULL DEFAULT '0' COMMENT '二次充电保护电压',
    private  Float ascpv;
    //  float NOT NULL DEFAULT '0' COMMENT '二次放电保护电压',
    private  Float asdpv;
    //   varchar(64) NOT NULL DEFAULT '0,0,0' COMMENT '充电过流保护档位1',
    @TableField("nchp_1")
    private  String nchp_1;
    //   varchar(64) NOT NULL DEFAULT '0,0,0' COMMENT '充电过流保护档位2',
    @TableField("nchp_2")
    private  String nchp_2;
    //   varchar(64) NOT NULL DEFAULT '0,0,0' COMMENT '充电过流保护档位3',
    @TableField("nchp_3")
    private  String nchp_3;
    //   varchar(64) NOT NULL DEFAULT '0,0,0' COMMENT '放电过流保护档位1',
    @TableField("ndhp_1")
    private  String ndhp_1;
    //   varchar(64) NOT NULL DEFAULT '0,0,0' COMMENT '放电过流保护档位2',
    @TableField("ndhp_2")
    private  String ndhp_2;
    //   varchar(64) NOT NULL DEFAULT '0,0,0' COMMENT '放电过流保护档位3',
    @TableField("ndhp_3")
    private  String ndhp_3;
    //   varchar(64) NOT NULL DEFAULT '0,0,0,0' COMMENT '主板温度保护值',
    @TableField("npcm_1")
    private  String npcm_1;
    //   varchar(64) NOT NULL DEFAULT '0,0,0,0' COMMENT '电池温度1保护值',
    @TableField("npcm_2")
    private  String npcm_2;
    //   varchar(64) NOT NULL DEFAULT '0,0,0,0' COMMENT '电池温度2保护值',
    @TableField("npcm_3")
    private  String npcm_3;
    //   varchar(64) NOT NULL DEFAULT '0,0,0,0' COMMENT '电池温度3保护值',
    @TableField("npcm_4")
    private  String npcm_4;
    //   varchar(64) NOT NULL DEFAULT '0,0,0,0' COMMENT '电池温度4保护值',
    @TableField("npcm_5")
    private  String npcm_5;
    // int(11) NOT NULL DEFAULT '0' COMMENT '标称容量',
    private  Integer bcrl;
    //float NOT NULL DEFAULT '0' COMMENT '额定电流',
    private  Float boardrated;
    // int(11) NOT NULL DEFAULT '0' COMMENT '均衡开关',
    private  Integer emst;
    // float NOT NULL DEFAULT '0' COMMENT '均衡启控电压',
    private  Float esbv;
    // float NOT NULL DEFAULT '0' COMMENT '均衡电流',
    private  Float esba;
    // int(11) NOT NULL DEFAULT '0' COMMENT '充电开关',
    private  Integer chon;
    // int(11) NOT NULL DEFAULT '0' COMMENT '放电开关',
    private  Integer dhon;
    //  float(11,0) NOT NULL DEFAULT '0' COMMENT '低容量报警值',
    private  Float lrlav;
    //  bigint(20) NOT NULL DEFAULT '0' COMMENT 'bms时间',
    @TableField("bms_datetime")
    private  Long bms_datetime;
    // int(11) NOT NULL DEFAULT '0' COMMENT '电池类型(0-三元  1-铁锂)',
    private  Integer batterytype;
    //      int(11) NOT NULL DEFAULT '0' COMMENT '0-放电中   1-充电中  2-闲置',
    private  Integer workstate;
    //     int(11) NOT NULL DEFAULT '0' COMMENT '电池数量',
    private  Integer batteryc;
    //float NOT NULL DEFAULT '0' COMMENT '电池1电压',
    @TableField("battery_v1")
    private  Float battery_v1;
    //float NOT NULL DEFAULT '0' COMMENT '电池2电压',
    @TableField("battery_v2")
    private  Float battery_v2;
    //float NOT NULL DEFAULT '0' COMMENT '电池3电压',
    @TableField("battery_v3")
    private  Float battery_v3;
    //float NOT NULL DEFAULT '0' COMMENT '电池4电压',
    @TableField("battery_v4")
    private  Float battery_v4;
    //float NOT NULL DEFAULT '0' COMMENT '电池5电压',
    @TableField("battery_v5")
    private  Float battery_v5;
    //float NOT NULL DEFAULT '0' COMMENT '电池6电压',
    @TableField("battery_v6")
    private  Float battery_v6;
    //float NOT NULL DEFAULT '0' COMMENT '电池7电压',
    @TableField("battery_v7")
    private  Float battery_v7;
    //float NOT NULL DEFAULT '0' COMMENT '电池8电压',
    @TableField("battery_v8")
    private  Float battery_v8;
    //float NOT NULL DEFAULT '0' COMMENT '电池9电压',
    @TableField("battery_v9")
    private  Float battery_v9;
    // float NOT NULL DEFAULT '0' COMMENT '电池10电压',
    @TableField("battery_v10")
    private  Float battery_v10;
    // float NOT NULL DEFAULT '0' COMMENT '电池11电压',
    @TableField("battery_v11")
    private  Float battery_v11;
    // float NOT NULL DEFAULT '0' COMMENT '电池12电压',
    @TableField("battery_v12")
    private  Float battery_v12;
    // float NOT NULL DEFAULT '0' COMMENT '电池13电压',
    @TableField("battery_v13")
    private  Float battery_v13;
    // float NOT NULL DEFAULT '0' COMMENT '电池14电压',
    @TableField("battery_v14")
    private  Float battery_v14;
    // float NOT NULL DEFAULT '0' COMMENT '电池15电压',
    @TableField("battery_v15")
    private  Float battery_v15;
    // float NOT NULL DEFAULT '0' COMMENT '电池16电压',
    @TableField("battery_v16")
    private  Float battery_v16;
    // float NOT NULL DEFAULT '0' COMMENT '电池17电压',
    @TableField("battery_v17")
    private  Float battery_v17;
    // float NOT NULL DEFAULT '0' COMMENT '电池18电压',
    @TableField("battery_v18")
    private  Float battery_v18;
    // float NOT NULL DEFAULT '0' COMMENT '电池19电压',
    @TableField("battery_v19")
    private  Float battery_v19;
    // float NOT NULL DEFAULT '0' COMMENT '电池20电压',
    @TableField("battery_v20")
    private  Float battery_v20;
    // float NOT NULL DEFAULT '0' COMMENT '电池21电压',
    @TableField("battery_v21")
    private  Float battery_v21;
    // float NOT NULL DEFAULT '0' COMMENT '电池22电压',
    @TableField("battery_v22")
    private  Float battery_v22;
    // float NOT NULL DEFAULT '0' COMMENT '电池23电压',
    @TableField("battery_v23")
    private  Float battery_v23;
    // float NOT NULL DEFAULT '0' COMMENT '电池24电压',
    @TableField("battery_v24")
    private  Float battery_v24;
    // float NOT NULL DEFAULT '0' COMMENT '电池25电压',
    @TableField("battery_v25")
    private  Float battery_v25;
    // float NOT NULL DEFAULT '0' COMMENT '电池26电压',
    @TableField("battery_v26")
    private  Float battery_v26;
    // float NOT NULL DEFAULT '0' COMMENT '电池27电压',
    @TableField("battery_v27")
    private  Float battery_v27;
    // float NOT NULL DEFAULT '0' COMMENT '电池28电压',
    @TableField("battery_v28")
    private  Float battery_v28;
    // float NOT NULL DEFAULT '0' COMMENT '电池29电压',
    @TableField("battery_v29")
    private  Float battery_v29;
    // float NOT NULL DEFAULT '0' COMMENT '电池30电压',
    @TableField("battery_v30")
    private  Float battery_v30;
    // float NOT NULL DEFAULT '0' COMMENT '电池31电压',
    @TableField("battery_v31")
    private  Float battery_v31;
    // float NOT NULL DEFAULT '0' COMMENT '电池32电压',
    @TableField("battery_v32")
    private  Float battery_v32;
    //    float NOT NULL DEFAULT '0' COMMENT '单体最高电压',
    private  Float ceilingvoltage;
    //    float NOT NULL DEFAULT '0' COMMENT '单体最低电压',
    private  Float minimumvoltage;
    // float NOT NULL DEFAULT '0' COMMENT '单体最大压差',
    private  Float cvoltagesub;
    //   int(11) NOT NULL DEFAULT '0' COMMENT '单体过压次数',
    @TableField("single_over_pressure")
    private  Integer single_over_pressure;
    //   int(11) NOT NULL DEFAULT '0' COMMENT '单体欠压次数',
    @TableField("single_under_voltage")
    private  Integer single_under_voltage;
    //  float NOT NULL DEFAULT '0' COMMENT '总电压',
    @TableField("betteryv_all")
    private  Float betteryv_all;
    //  int(11) NOT NULL DEFAULT '0' COMMENT '整体过压次数',
    @TableField("whole_over_pressure")
    private  Integer whole_over_pressure;
    //   int(11) NOT NULL DEFAULT '0' COMMENT '整体欠压次数',
    @TableField("whole_under_pressure")
    private  Integer whole_under_pressure;
    //    float NOT NULL DEFAULT '0' COMMENT '充电电流',
    private  Float cpowera;
    //    int(11) NOT NULL DEFAULT '0' COMMENT '充电过流次数',
    @TableField("outcharging_highcount")
    private  Integer outcharging_highcount;
    //    float NOT NULL DEFAULT '0' COMMENT '放电电流',
    private  Float dpowera;
    //      int(11) NOT NULL DEFAULT '0' COMMENT '放电过流次数',
    @TableField("outuncharging_highcount")
    private  Integer outuncharging_highcount;
    //     int(11) COMMENT '充电保护状态(0-正常  1-硬控保护  2-软控保护)',
    private  Integer cpstatus;
    //    int(11) NOT NULL DEFAULT '0' COMMENT '充电保护次数',
    private  Integer cpcount;
    //     int(11) COMMENT '放电保护状态(0-正常  1-硬控保护  2-软控保护)',
    private  Integer dpstatus;
    //    int(11) NOT NULL DEFAULT '0' COMMENT '放电保护次数',
    private  Integer dpcount;
    //      int(11) NOT NULL DEFAULT '0' COMMENT '短路保护(0-正常  1-保护)',
    private  Integer scprotect;
    //     int(11) NOT NULL DEFAULT '0' COMMENT '短路保护次数',
    private  Integer scpcount;
    //     int(11)  COMMENT '均衡类型(0-无均衡 1-被动 2-主动)',
    @TableField("balance_type")
    private  Integer balance_type;
    //      int(11) NOT NULL DEFAULT '0' COMMENT '均衡开关(0-关  1-开)',
    private  Integer em;
    //  int(11) NOT NULL DEFAULT '0' COMMENT '电池1均衡状态(0-关  1-开)',
    @TableField("ems_1")
    private  Integer ems_1;
    //  int(11) NOT NULL DEFAULT '0' COMMENT '电池2均衡状态(0-关  1-开)',
    @TableField("ems_2")
    private  Integer ems_2;
    // int(11) NOT NULL DEFAULT '0' COMMENT '循环使用次数',
    private  Integer bxhc;
    // float NOT NULL DEFAULT '0' COMMENT '保护板温度',
    @TableField("tc_t")
    private  Float tc_t;
    //  float NOT NULL DEFAULT '0' COMMENT '电池温度1',
    @TableField("tc_b1")
    private  Float tc_b1;
    //  float NOT NULL DEFAULT '0' COMMENT '电池温度2',
    @TableField("tc_b2")
    private  Float tc_b2;
    // int(11) NOT NULL DEFAULT '0' COMMENT '充电过温次数',
    private  Integer cpsuperheat;
    // int(11) NOT NULL DEFAULT '0' COMMENT '充电低温次数',
    private  Integer cpsubcooled;
    // int(11) NOT NULL DEFAULT '0' COMMENT '放电过温次数',
    private  Integer dpsuperheat;
    // int(11) NOT NULL DEFAULT '0' COMMENT '放电低温次数',
    private  Integer dpsubcooled;
    //float NOT NULL DEFAULT '0' COMMENT '标称容量',
    private  Float fcc;
    // float NOT NULL DEFAULT '0' COMMENT '剩余容量',
    private  Float syla;
    //float NOT NULL DEFAULT '0' COMMENT '剩余容量百分比',
    private  Float soc;
    // varchar(255) NOT NULL DEFAULT '' COMMENT '出厂日期',
    private  String ccxx;
    //    varchar(255) NOT NULL DEFAULT '' COMMENT '厂商编码',
    private  String bmscode;
    //      bigint(20) NOT NULL DEFAULT '0' COMMENT '设备时间'
    @TableField("bms_dev_datetime")
    private  Long bms_dev_datetime;
}
src/main/java/com/whyc/pojo/DfxtDeviceList.java
New file
@@ -0,0 +1,49 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
 * 东峰系统所有设备列表
 */
@Data
@TableName(schema = "db_ram_db",value = "tb_dfxt_devicelist")
public class DfxtDeviceList {
    //自增主键
    private Long num;
    //设备号
    private String objectid;
    //设备号
    private String macid;
    //车牌号
    private String platenumber;
    //设备名称
    private String fullname;
    //设备到期时间
    private Date block_date;
    //是否在线
    private Integer offline;
    //网络信号值
    private Float gsm;
    //gps星数
    private Integer gpsCount;
    //速度
    private Float speed;
    //最后更新时间
    private Long updtime;
    //设防状态
    private Integer defence_status;
    //定位时间
    private Long gpstime;
    //设备型号
    private String mac_name;
    //当前时间
    private Long server_time;
    //SIM卡号码
    private String sim;
}
src/main/java/com/whyc/service/DfxtBmsStateService.java
New file
@@ -0,0 +1,24 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.whyc.dto.Response;
import com.whyc.mapper.DfxtBmsStateMapper;
import com.whyc.pojo.DfxtBmsState;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class DfxtBmsStateService {
    @Resource
    private DfxtBmsStateMapper mapper;
    public Response<DfxtBmsState> getByDevId(Integer devId) {
        QueryWrapper<DfxtBmsState> query = Wrappers.query();
        query.eq("dev_id",devId);
        query.last(" limit 1");
        DfxtBmsState state = mapper.selectOne(query);
        return new Response<DfxtBmsState>().set(1,state);
    }
}
src/main/java/com/whyc/service/DfxtDeviceListService.java
New file
@@ -0,0 +1,23 @@
package com.whyc.service;
import com.whyc.dto.DfxtDeviceDTO;
import com.whyc.dto.Response;
import com.whyc.mapper.DfxtDeviceListMapper;
import com.whyc.pojo.DfxtDeviceList;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class DfxtDeviceListService {
    @Resource
    private DfxtDeviceListMapper mapper;
    public Response<List<DfxtDeviceDTO>> getDeviceList() {
        List<DfxtDeviceDTO> list = mapper.getDeviceList();
        return new Response<List<DfxtDeviceDTO>>().set(1,list);
    }
}
src/main/java/com/whyc/webSocket/DfxtBmsStateSocket.java
New file
@@ -0,0 +1,95 @@
package com.whyc.webSocket;
import com.whyc.service.DfxtBmsStateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
@ServerEndpoint(value = "/dfxtBmsState",encoders = WebSocketEncoder.class)
@Component
public class DfxtBmsStateSocket {
    private volatile Thread thread;
    private static final int executeTime = 15000;
    private volatile boolean runFlag=true;
    private static DfxtBmsStateService service;
    private volatile Map<String,Thread> threadMap = new HashMap<>();
    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
    private Session session;
    @Autowired
    public void setService(DfxtBmsStateService service) {
        DfxtBmsStateSocket.service = service;
    }
    @OnOpen
    public void onOpen(Session session){
        this.session=session;
    }
    @OnMessage
    public synchronized void onMessage(Session session,String msg){
        Integer devId = Integer.parseInt(msg);
        this.thread = new Thread("Thread_DfxtBmsStateSocket") {
            public void run() {
                while (runFlag && !isInterrupted()) {
                    Thread thread = currentThread();
                    threadFlagMap.put(thread.getId(), true);
                    try {
                        if (session.isOpen()) {
                            //推送信息
                            synchronized (session) {
                                session.getBasicRemote().sendObject(service.getByDevId(devId));
                            }
                            threadFlagMap.put(thread.getId(),false);
                        }
                        sleep(executeTime);
                        //} catch (IOException | InterruptedException | EncodeException e) {
                    } catch (Exception e) {
                        interrupt();
                    }
                }
            }
        };
        this.thread.start();
        threadFlagMap.put(thread.getId(),true);
        //停止老的socket线程
        Thread threadBefore = threadMap.get(session.getId());
        if(threadBefore !=null && threadBefore.isAlive()){
            while (threadFlagMap.get(threadBefore.getId())){
            }
            threadBefore.interrupt();
        }
        //将线程存储,便于调用定位
        threadMap.put(session.getId(), this.thread);
    }
    @OnClose
    public void onClose(CloseReason closeReason){
        System.err.println("closeReason = " + closeReason);
        runFlag = false;
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
}