相机配置,增加easeai测试增加sse连接

湖北-大华摄像头
LAPTOP-S9HJSOEB\昊天 12 months ago
parent 6e12cb63e2
commit a4d385c98b

@ -18,6 +18,11 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>org.dromara.easyai</groupId>
<artifactId>easyAi</artifactId>
<version>1.3.2</version>
</dependency>
<dependency> <dependency>
<groupId>commons-net</groupId> <groupId>commons-net</groupId>
<artifactId>commons-net</artifactId> <artifactId>commons-net</artifactId>

@ -0,0 +1,38 @@
package com.zhehekeji.web.config;
import lombok.Data;
import org.dromara.easyai.yolo.FastYolo;
import org.dromara.easyai.yolo.YoloConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@ConfigurationProperties
@Data
public class EaseAiConfig {
@Bean
public YoloConfig yoloConfig(){
YoloConfig yoloConfig = new YoloConfig();//创建配置参数类
yoloConfig.setWindowHeight(300);
yoloConfig.setWindowWidth(600);
yoloConfig.setTypeNub(5);
yoloConfig.setEnhance(40);
yoloConfig.setContainIouTh(0.1);
yoloConfig.setPth(0.7);
return yoloConfig;
}
@Bean
public FastYolo fastYolo(YoloConfig yoloConfig){
try {
return new FastYolo(yoloConfig);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

@ -0,0 +1,128 @@
package com.zhehekeji.web.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.*;
import com.zhehekeji.web.mapper.CameraIOMapper;
import com.zhehekeji.web.pojo.camera.CameraConfigSearchReq;
import com.zhehekeji.web.service.CameraService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Api(value = "cameraIo",tags = "球机预置点")
@RestController
@RequestMapping("/cameraIo")
@Slf4j
public class CameraIoController {
@Resource
private CameraIOMapper cameraIOMapper;
@Resource
private CameraService cameraService;
@PostMapping("/config")
@ApiOperation(value = "球机IO配置新增 ")
public Result addConfig (@RequestBody CameraIO config) {
cameraService.ptz(null, config.getCameraId(), config.getName(),0,config.getCode());
return Result.success();
}
@PostMapping("/realTimeCamera")
@ApiOperation(value = "球机IO配置分页列表")
public Result<List<Camera>> configPage () {
List<Camera> cameras = cameraService.allCameras();
List<CameraIO> cameraIOs = cameraIOMapper.selectList(new QueryWrapper<CameraIO>());
Map<Integer, List<CameraIO>> map = cameraIOs.stream().collect(Collectors.groupingBy(CameraIO::getCameraId));
for (Camera camera : cameras) {
camera.setStatus(cameraService.getPtzIdByCodeAndCameraId(camera.getRtsp(),camera.getId())!=null?"在线":"离线");
camera.setCameraIOs(map.get(camera.getId()));
}
return Result.success(cameras);
}
@PostMapping("/config/page")
@ApiOperation(value = "球机IO配置分页列表")
public Result<List<CameraIO>> configPage (@RequestBody CameraIO cameraIO) {
return Result.success(cameraIOMapper.selectList(new QueryWrapper<CameraIO>().eq(cameraIO.getCameraId()!=null,"camera_id",cameraIO.getCameraId())));
}
@PutMapping("/config")
@ApiOperation(value = "球机IO配置修改 ")
public Result editConfig (@RequestBody CameraIO config) {
cameraIOMapper.updateById(config);
return Result.success();
}
@PostMapping("/getDeviceTree")
@ApiOperation(value = "获取设备树")
public Result<List<DeviceResp>> getDeviceTree () {
List<DeviceResp> deviceResps = cameraService.getDeviceTree();
return Result.success(deviceResps);
}
@DeleteMapping("/config")
@ApiOperation(value = "球机IO配置删除 ")
public Result delConfig (@RequestBody CameraIO config) {
cameraIOMapper.deleteById(config.getId());
return Result.success();
}
public static void main(String[] args) {
Path sourceDirectory = Paths.get("E:\\玉溪\\mysql");
Path targetFile = Paths.get("E:\\玉溪\\mysql1.txt");
try {
mergeFiles(sourceDirectory, targetFile);
System.out.println("文件合并完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void mergeFiles(Path sourceDirectory, Path targetFile) throws IOException {
List<Path> files = new ArrayList<>();
Files.walkFileTree(sourceDirectory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (Files.isRegularFile(file)) {
files.add(file);
}
return FileVisitResult.CONTINUE;
}
});
try (BufferedWriter writer = Files.newBufferedWriter(targetFile)) {
for (Path file : files) {
//writer.write("开始文件: " + file.getFileName() + "\n");
Files.lines(file).forEach(line -> {
try {
writer.write(line);
writer.newLine();
} catch (IOException e) {
e.printStackTrace();
}
});
// writer.write("结束文件: " + file.getFileName() + "\n\n");
}
}
}
}

@ -0,0 +1,119 @@
package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.easeAi.TestPic;
import com.zhehekeji.web.entity.CheckLog;
import com.zhehekeji.web.pojo.stock.CheckLogSearch;
import com.zhehekeji.web.service.CheckLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.dromara.easyai.entity.ThreeChannelMatrix;
import org.dromara.easyai.tools.ImageTools;
import org.dromara.easyai.tools.Picture;
import org.dromara.easyai.yolo.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Api(tags = "简单深度学习")
@RequestMapping("/EaseAiController")
@RestController
public class EaseController {
@Resource
private YoloConfig yoloConfig;
@Resource
private FastYolo fastYolo;
@Resource
private CheckLogService checkLogService;
@Resource
private ValidatorUtil validatorUtil;
List<YoloSample> yoloSamples = new ArrayList<>();
@ApiOperation("简单测试")
@PostMapping("")
public Result<PageInfo<CheckLog>> list(@RequestBody YoloSample yoloSample){
try {
// YoloModel yoloModel = new YoloModel();//从训练的模型中JSON反序列化读取模型
//
// yolo.insertModel(yoloModel);
yoloSample.setLocationURL("E:\\YXP/"+yoloSample.getLocationURL());
yoloSamples.add(yoloSample);
} catch (Exception e) {
throw new RuntimeException(e);
}
// 初始化过程
return Result.success();
}
@ApiOperation("简单测试")
@PostMapping("2")
public Result<PageInfo<CheckLog>> set(){
try {
fastYolo.toStudy(yoloSamples);//开始训练,训练耗时较长
} catch (Exception e) {
throw new RuntimeException(e);
}
YoloModel yoloModel = null;//训练完毕获取模型
try {
yoloModel = fastYolo.getModel();
} catch (Exception e) {
throw new RuntimeException(e);
}
TestPic.writeModel(JSON.toJSONString(yoloModel), "D:\\lesson/yoloModel.json");//将模型序列化为JSON字符串保存到磁盘文件
return Result.success();
}
public static void main(String[] args) {
}
@ApiOperation("简单测试")
@PostMapping("11")
public Result<PageInfo<CheckLog>> get(){
FastYolo yolo = null; //初始化图像识别类
try {
yolo = new FastYolo(yoloConfig);
// YoloModel yoloModel = new YoloModel();//从训练的模型中JSON反序列化读取模型
//
// yolo.insertModel(yoloModel);
YoloModel yoloModel = TestPic.readModelParameter("D:\\lesson/yoloModel.json");//从训练的模型中JSON反序列化读取模型
yolo.insertModel(yoloModel);//识别类注入模型
//Picture picture = new Picture();//初始化图像解析类
ThreeChannelMatrix th = Picture.getThreeMatrix("D:\\test\\11\\00J50359930.jpeg",false);//将图像解析为三通道矩阵
List<OutBox> list = yolo.look(th, 100);
ImageTools imageTools = new ImageTools();
ImageTools.drawBox("D:\\test\\11\\00J50359930.jpeg",list, "D:\\lesson\\yoloModel.jpeg",2);
//对该图像矩阵进行识别,并返回识别结果
} catch (Exception e) {
throw new RuntimeException(e);
}
return Result.success();
}
}

@ -0,0 +1,101 @@
package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Camera;
import com.zhehekeji.web.entity.CameraIO;
import com.zhehekeji.web.entity.SseMsgEntity;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.lib.CameraControlModule;
import com.zhehekeji.web.mapper.CameraIOMapper;
import com.zhehekeji.web.service.CameraService;
import com.zhehekeji.web.service.StreetConn;
import com.zhehekeji.web.util.SseClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Api(value = "sseConfig",tags = "sse设置")
@RestController
@RequestMapping("/sse")
@Slf4j
public class SseClientController {
@Resource
private SseClient sseClient;
@Resource
private CameraIOMapper cameraIOMapper;
@Resource
private CameraService cameraService;
@Resource
private CameraControlModule cameraControlModule;
@GetMapping("/index")
@ResponseBody
public Result<String> index() {
String uid = UUID.randomUUID().toString();
return Result.success(uid);
}
@GetMapping("/cameraIo/{type}")
@ApiOperation(value = "门禁警告上传")
public Result cameraIoType(@PathVariable String type){
List<CameraIO> cameraIOs = cameraIOMapper.selectList(new QueryWrapper<CameraIO>().eq("code",type));
for (CameraIO cameraIO: cameraIOs){
try {
cameraControlModule.toPtz(cameraIO.getPtzId(),cameraIO.getCameraId());
}catch (Exception e){
log.error("ptz失败",e);
}
Camera camera = cameraService.detail(cameraIO.getCameraId());
camera.setCameraIOs(new ArrayList<>());
camera.getCameraIOs().add(cameraIO);
SseMsgEntity sseMsgEntity = new SseMsgEntity();
sseMsgEntity.setCameraId(camera.getId());
sseMsgEntity.setDevice(camera.getType());
sseMsgEntity.setCode(type);
sseMsgEntity.setCameraIO(cameraIO);
sseMsgEntity.setCamera(camera);
sseClient.sendAll(JSON.toJSONString(sseMsgEntity));
}
return Result.success();
}
@CrossOrigin
@GetMapping("/createSse/{uid}")
public SseEmitter createConnect(@PathVariable String uid) {
return sseClient.createSse(uid);
}
@CrossOrigin
@GetMapping("/sendMsg")
@ResponseBody
public String sseChat(@RequestBody SseMsgEntity sseMsgEntity) {
for (int i = 0; i < 10; i++) {
sseClient.sendMessage(sseMsgEntity.getUid(), "no"+i,sseMsgEntity.getMessage());
}
return "ok";
}
/**
*
*/
@CrossOrigin
@PostMapping("/closeSse")
public Result closeConnect(@RequestBody SseMsgEntity sseMsgEntity ){
sseClient.closeSse(sseMsgEntity.getUid());
return Result.success();
}
}

@ -0,0 +1,15 @@
package com.zhehekeji.web.easeAi;
import lombok.Data;
@Data
public class Image {
private String url;
private int x;
private int y;
private int width;
private int height;
private String text;
private String type;
}

@ -0,0 +1,66 @@
package com.zhehekeji.web.easeAi;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.dromara.easyai.entity.ThreeChannelMatrix;
import org.dromara.easyai.yolo.*;
import javax.annotation.Resource;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class TestPic {
@Resource
private YoloConfig yoloConfig;
public static void main(String[] args) {
}
static public void writeModel(String json, String path) {
// 目标文件夹路径
Path folderPath = Paths.get(path);
try {
// 创建文件夹及所有上级文件夹
Files.createDirectories(folderPath.getParent());
System.out.println("文件夹已创建:" + folderPath);
} catch (IOException e) {
e.printStackTrace();
System.out.println("创建文件夹失败!");
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(path))) {
// 写入字符到文件
writer.write(json);
writer.newLine(); // 写入换行符
System.out.println("内容已成功写入文件。");
} catch (IOException e) {
e.printStackTrace();
}
}
public static YoloModel readModelParameter(String s) {
YoloModel yoloModel = null;
try (FileReader reader = new FileReader(s)) {
// 读取JSON文件内容
StringBuilder stringBuilder = new StringBuilder();
int i;
while ((i = reader.read()) != -1) {
stringBuilder.append((char) i);
}
String jsonString = stringBuilder.toString();
// 将 JSON 字符串转换为 Person 对象
yoloModel = JSON.parseObject(jsonString, YoloModel.class);
} catch (IOException e) {
e.printStackTrace();
}
return yoloModel;
}
}

@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
@Data @Data
@TableName("`camera`") @TableName("`camera`")
@ -19,6 +20,8 @@ public class Camera {
private String name; private String name;
private String type;
private String ip; private String ip;
private Integer port; private Integer port;
@ -36,9 +39,13 @@ public class Camera {
private Integer rtcServerPort; private Integer rtcServerPort;
private String channel;
@ApiModelProperty(value = "预置点 增长值",hidden = true) @ApiModelProperty(value = "预置点 增长值",hidden = true)
private Integer ptzId; private Integer ptzId;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime; private LocalDateTime updateTime;
@TableField(exist = false)
private List<CameraIO> cameraIOs;
} }

@ -1,6 +1,7 @@
package com.zhehekeji.web.entity; package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@ -18,6 +19,7 @@ public class CameraIO {
private Integer cameraId; private Integer cameraId;
@TableField("code")
private String code; private String code;
private String name; private String name;

@ -14,6 +14,7 @@ public class CameraIOConfig {
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private Integer id; private Integer id;
private String name; private String name;
private String code; private String code;

@ -0,0 +1,17 @@
package com.zhehekeji.web.entity;
import lombok.Data;
import java.util.List;
@Data
public class DeviceResp {
private String title;
private String key;
private List<DeviceResp> children;
private Integer id;
private String name;
private Camera camera;
private CameraIO cameraIO;
}

@ -0,0 +1,15 @@
package com.zhehekeji.web.entity;
import lombok.Data;
@Data
public class SseMsgEntity {
private String messageId;
private String message;
private String uid;
private String device;
private Integer cameraId;
private CameraIO cameraIO;
private Camera camera;
private String code;
}

@ -1,6 +1,7 @@
package com.zhehekeji.web.service; package com.zhehekeji.web.service;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.util.Assert; import com.zhehekeji.core.util.Assert;
@ -8,6 +9,7 @@ import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.Camera;
import com.zhehekeji.web.entity.CameraIO; import com.zhehekeji.web.entity.CameraIO;
import com.zhehekeji.web.entity.CameraIOConfig; import com.zhehekeji.web.entity.CameraIOConfig;
import com.zhehekeji.web.entity.DeviceResp;
import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.CameraConnMap;
import com.zhehekeji.web.lib.CameraControlLoginModule; import com.zhehekeji.web.lib.CameraControlLoginModule;
import com.zhehekeji.web.lib.CameraControlModule; import com.zhehekeji.web.lib.CameraControlModule;
@ -23,6 +25,7 @@ import com.zhehekeji.web.pojo.camera.IOImport;
import com.zhehekeji.web.pojo.street.StreetSearch; import com.zhehekeji.web.pojo.street.StreetSearch;
import io.swagger.models.auth.In; import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
@ -33,8 +36,10 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -125,6 +130,52 @@ public class CameraService {
return new PageInfo<>(cameras); return new PageInfo<>(cameras);
} }
public List<DeviceResp> getDeviceTree() {
List<Camera> cameras = cameraMapper.selectList(new QueryWrapper<>());
List<CameraIO> cameraIOS = ioMapper.selectList(new QueryWrapper<>());
Map<Integer,List<CameraIO>> mapCameraIo = cameraIOS.stream().collect(Collectors.groupingBy(CameraIO::getCameraId));
Map<String,List<Camera>> map = cameras.stream()
.peek(camera ->{
camera.setCameraIOs(mapCameraIo.get(camera.getId()));
if(Strings.isBlank(camera.getType())){
camera.setType("其他");
}
} )
.collect(Collectors.groupingBy(Camera::getType));
List<DeviceResp> deviceResps = new ArrayList<>();
//第一级
map.forEach((key,value) -> {
DeviceResp deviceResp = new DeviceResp();
deviceResp.setName(key);
deviceResp.setKey(key);
deviceResp.setTitle(key);
deviceResp.setChildren(new ArrayList<>());
//第二级
for (Camera camera: value){
DeviceResp deviceResp2 = new DeviceResp();
deviceResp2.setKey(key+"-"+camera.getId());
deviceResp2.setTitle(camera.getName());
deviceResp2.setId(camera.getId());
deviceResp2.setCamera(camera);
deviceResp2.setChildren(new ArrayList<>());
//第三级
for (CameraIO cameraIO: mapCameraIo.get(camera.getId())){
DeviceResp deviceResp3 = new DeviceResp();
deviceResp3.setKey(key+"-"+camera.getId()+"-"+cameraIO.getId());
deviceResp3.setTitle(cameraIO.getName());
deviceResp3.setId(cameraIO.getId());
deviceResp3.setCamera(camera);
deviceResp3.setCameraIO(cameraIO);
deviceResp2.getChildren().add(deviceResp3);
}
deviceResp.getChildren().add(deviceResp2);
}
deviceResps.add(deviceResp);
});
return deviceResps;
}
public class StatusThread extends Thread{ public class StatusThread extends Thread{
private Camera camera; private Camera camera;
private CountDownLatch latch; private CountDownLatch latch;
@ -285,6 +336,7 @@ public class CameraService {
cameraIO.setPtzId(ptzId); cameraIO.setPtzId(ptzId);
cameraIO.setCode(code); cameraIO.setCode(code);
conver(cameraIO,0); conver(cameraIO,0);
//ioMapper.insert(cameraIO);
try { try {
ioMapper.insert(cameraIO); ioMapper.insert(cameraIO);
}catch (DuplicateKeyException e){ }catch (DuplicateKeyException e){

@ -90,7 +90,7 @@ public class InitService implements ApplicationRunner {
}); });
LPLicense.createLicKeyIfNotExist(); LPLicense.createLicKeyIfNotExist();
//plc连接 //plc连接
if(configProperties.getServerMode() == 0){ /*if(configProperties.getServerMode() == 0){
log.info("PLC TCP MODE"); log.info("PLC TCP MODE");
//plc 连接状态初始化 //plc 连接状态初始化
List<Street> streets = streetMapper.selectByMap(new HashMap<>(0)); List<Street> streets = streetMapper.selectByMap(new HashMap<>(0));
@ -120,7 +120,7 @@ public class InitService implements ApplicationRunner {
} }
} }
NettyServer nettyServer = new NettyServer(); NettyServer nettyServer = new NettyServer();
nettyServer.CreateNettyServer(9040); nettyServer.CreateNettyServer(9040);*/
TaskDelayExecutor.runMp4DownloadExecutor(); TaskDelayExecutor.runMp4DownloadExecutor();
GetPhotoDelayExecutor.runExecutor(streetMapper.selectList(new QueryWrapper<>()),plcService); GetPhotoDelayExecutor.runExecutor(streetMapper.selectList(new QueryWrapper<>()),plcService);
} }

@ -0,0 +1,120 @@
package com.zhehekeji.web.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
public class SseClient {
private static final Map<String, SseEmitter> sseEmitterMap = new ConcurrentHashMap<>();
/**
*
*/
public SseEmitter createSse(String uid) {
//默认30秒超时,设置为0L则永不超时
SseEmitter sseEmitter = new SseEmitter(0l);
//完成后回调
sseEmitter.onCompletion(() -> {
log.info("[{}]结束连接...................", uid);
sseEmitterMap.remove(uid);
});
//超时回调
sseEmitter.onTimeout(() -> {
log.info("[{}]连接超时...................", uid);
});
//异常回调
sseEmitter.onError(
throwable -> {
try {
log.info("[{}]连接异常,{}", uid, throwable.toString());
sseEmitter.send(SseEmitter.event()
.id(uid)
.name("发生异常!")
.data("发生异常请重试!")
.reconnectTime(3000));
sseEmitterMap.put(uid, sseEmitter);
} catch (IOException e) {
e.printStackTrace();
}
}
);
try {
sseEmitter.send(SseEmitter.event().reconnectTime(5000));
} catch (IOException e) {
e.printStackTrace();
}
sseEmitterMap.put(uid, sseEmitter);
log.info("[{}]创建sse连接成功", uid);
return sseEmitter;
}
/**
*
*
*/
public boolean sendMessage(String uid,String messageId, String message) {
if (Strings.isBlank(message)) {
log.info("参数异常msg为null", uid);
return false;
}
SseEmitter sseEmitter = sseEmitterMap.get(uid);
if (sseEmitter == null) {
log.info("消息推送失败uid:[{}],没有创建连接,请重试。", uid);
return false;
}
try {
sseEmitter.send(SseEmitter.event().id(messageId).reconnectTime(1*60*1000L).data(message));
log.info("用户{},消息id:{},推送成功:{}", uid,messageId, message);
return true;
}catch (Exception e) {
sseEmitterMap.remove(uid);
log.info("用户{},消息id:{},推送异常:{}", uid,messageId, e.getMessage());
sseEmitter.complete();
return false;
}
}
public void sendAll(String message) {
if (Strings.isBlank(message)) {
log.info("参数异常msg为null", message);
}
// SseEmitter sseEmitter = sseEmitterMap.get(uid);
for (String sseEmitterStr :sseEmitterMap.keySet()){
String messageId = "all";
try {
sseEmitterMap.get(sseEmitterStr).send(SseEmitter.event().id(messageId).reconnectTime(1*60*1000L).data(message));
log.info("用户{},消息id:{},推送成功:{}", sseEmitterMap.get(sseEmitterStr),messageId, message);
}catch (Exception e) {
sseEmitterMap.remove( sseEmitterMap.get(sseEmitterStr));
log.info("用户{},消息id:{},推送异常:{}", sseEmitterMap.get(sseEmitterStr),messageId, e.getMessage());
sseEmitterMap.get(sseEmitterStr).complete();
}
}
}
/**
*
* @param uid
*/
public void closeSse(String uid){
if (sseEmitterMap.containsKey(uid)) {
SseEmitter sseEmitter = sseEmitterMap.get(uid);
sseEmitter.complete();
sseEmitterMap.remove(uid);
}else {
log.info("用户{} 连接已关闭",uid);
}
}
}
Loading…
Cancel
Save