diff --git a/car-business-common/src/main/java/com/god/business/common/domain/request/ReqAddBreakDown.java b/car-business-common/src/main/java/com/god/business/common/domain/request/ReqAddBreakDown.java index 7a19ff3..70b5b56 100644 --- a/car-business-common/src/main/java/com/god/business/common/domain/request/ReqAddBreakDown.java +++ b/car-business-common/src/main/java/com/god/business/common/domain/request/ReqAddBreakDown.java @@ -68,14 +68,4 @@ public class ReqAddBreakDown { @JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss",timezone = "GMT+8") private Date updateTime; - - - - - - - - - - } diff --git a/car-business-server/pom.xml b/car-business-server/pom.xml index e10e74f..e4d7791 100644 --- a/car-business-server/pom.xml +++ b/car-business-server/pom.xml @@ -46,7 +46,14 @@ org.springframework.boot spring-boot-starter-actuator - + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-websocket + io.springfox diff --git a/car-business-server/src/main/java/com/god/base/server/config/WebSocketConfig.java b/car-business-server/src/main/java/com/god/base/server/config/WebSocketConfig.java new file mode 100644 index 0000000..1749349 --- /dev/null +++ b/car-business-server/src/main/java/com/god/base/server/config/WebSocketConfig.java @@ -0,0 +1,20 @@ +package com.god.base.server.config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * Description: + * + * @Author: sun-cool-boy + * @Date: 2023/11/29 + * @info: 初始化webSocket + */ +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter(){ + return new ServerEndpointExporter(); + } +} diff --git a/car-business-server/src/main/java/com/god/base/server/consumer/RabbitConsumer.java b/car-business-server/src/main/java/com/god/base/server/consumer/RabbitConsumer.java new file mode 100644 index 0000000..3a57e19 --- /dev/null +++ b/car-business-server/src/main/java/com/god/base/server/consumer/RabbitConsumer.java @@ -0,0 +1,35 @@ +package com.god.base.server.consumer; + +import lombok.extern.java.Log; +import lombok.extern.log4j.Log4j; +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.rabbit.annotation.RabbitListeners; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Description: + * + * @Author: sun-cool-boy + * @Date: 2023/11/29 + * @info: + */ +@Component +@Log4j2 +public class RabbitConsumer { + + @RabbitListener(queuesToDeclare = {@Queue("OUT_FENCE")}) + public void one(String msg){ + log.info("监听到消息:{} , 队列名:{}",msg,"OUT_FENCE"); + System.out.println(msg); + } + + @RabbitListener(queuesToDeclare = {@Queue("IN_FENCE")}) + public void two(String msg){ + log.info("监听到消息:{} , 队列名:{}",msg,"IN_FENCE"); + System.out.println(msg); + } +} diff --git a/car-business-server/src/main/java/com/god/base/server/controller/AlarmController.java b/car-business-server/src/main/java/com/god/base/server/controller/AlarmController.java index 2135c08..b689992 100644 --- a/car-business-server/src/main/java/com/god/base/server/controller/AlarmController.java +++ b/car-business-server/src/main/java/com/god/base/server/controller/AlarmController.java @@ -9,10 +9,9 @@ import com.god.common.log.annotation.Log; import com.god.common.log.enums.BusinessType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; /** * 预警控制层 @@ -20,10 +19,10 @@ import org.springframework.web.bind.annotation.RequestParam; * @author LouZhiSHuo * @Date 2023/11/27 10:50 **/ -@Controller +@RestController public class AlarmController { - @Autowired + @Resource private AlarmService alarmService; @@ -51,7 +50,6 @@ public class AlarmController { public Result insertBreakDownLogs(@RequestBody ReqAddBreakDown reqAddBreakDown) { //添加车辆预警记录 alarmService.save(BreakDown.insertBreakDown(reqAddBreakDown)); - return Result.success(); } diff --git a/car-business-server/src/main/java/com/god/base/server/service/impl/AlarmServiceImpl.java b/car-business-server/src/main/java/com/god/base/server/service/impl/AlarmServiceImpl.java index 870d890..dea416a 100644 --- a/car-business-server/src/main/java/com/god/base/server/service/impl/AlarmServiceImpl.java +++ b/car-business-server/src/main/java/com/god/base/server/service/impl/AlarmServiceImpl.java @@ -23,8 +23,8 @@ import java.util.*; * @author LouZhiSHuo * @Date 2023/11/27 20:40 **/ -@Service @Log4j2 +@Service public class AlarmServiceImpl extends ServiceImpl implements AlarmService { @Resource @@ -130,4 +130,4 @@ public class AlarmServiceImpl extends ServiceImpl implem } return true; } -} \ No newline at end of file +} diff --git a/car-business-server/src/main/java/com/god/base/server/util/FenceAlgorithm.java b/car-business-server/src/main/java/com/god/base/server/util/FenceAlgorithm.java index e79e1ff..30c2608 100644 --- a/car-business-server/src/main/java/com/god/base/server/util/FenceAlgorithm.java +++ b/car-business-server/src/main/java/com/god/base/server/util/FenceAlgorithm.java @@ -21,7 +21,7 @@ public class FenceAlgorithm { * @param pts * @return */ - public boolean computeFence(Point2D.Double point, List pts){ + public static boolean computeFence(Point2D.Double point, List pts){ //围栏顶点坐标数 int fenceSize = pts.size(); diff --git a/car-business-server/src/main/java/com/god/base/server/websocket/WebSocketServer.java b/car-business-server/src/main/java/com/god/base/server/websocket/WebSocketServer.java new file mode 100644 index 0000000..68a42f2 --- /dev/null +++ b/car-business-server/src/main/java/com/god/base/server/websocket/WebSocketServer.java @@ -0,0 +1,183 @@ +package com.god.base.server.websocket; + +import com.alibaba.fastjson.JSON; +import com.mysql.cj.xdevapi.JsonString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.simp.annotation.SendToUser; +import org.springframework.stereotype.Component; +import springfox.documentation.spring.web.json.Json; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.Arrays; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + * Description: + * + * @Author: sun-cool-boy + * @Date: 2023/11/29 + * @info: + */ +@Slf4j +@Component +@ServerEndpoint("/websocket/{vin}") +public class WebSocketServer{ + + /** + *与某个客户端建立连接会话 通过session给客户端发送消息 + */ + private Session session; + + /** + * 客户端标识 用vin + */ + private String vin; + + /** + * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 + * 虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。 + * 注:底下WebSocketServer是当前类名 + */ + private static final CopyOnWriteArraySet webSocketServers = new CopyOnWriteArraySet<>(); + + /** + * 定义ConcurrentHashMap负责存储客户端信息 vin为键 session为值 + */ + private static final ConcurrentHashMap map = new ConcurrentHashMap<>(); + + /** + * 连接事件 + * @param session + * @param vin + */ + @OnOpen + public void onOpen(Session session, @PathParam(value = "vin") String vin){ + try { + this.session = session; + this.vin = vin; + webSocketServers.add(this); + map.put(vin,session); + log.info("【webSocket消息】 有新的连接,总数为:"+webSocketServers.size()); + //发送实时轨迹数据 + double[][] arr = new double[][]{ + {116.478935,39.997761}, + {116.478939,39.997825}, + {116.478912,39.998549}, + {116.478998,39.998555}, + {116.479282,39.99856}, + {116.479658,39.998528}, + {116.480151,39.998453}, + {116.480784,39.998302}, + {116.481149,39.998184}, + {116.481573,39.997997}, + {116.481863,39.997846}, + {116.482072,39.997718}, + {116.482362,39.997718}, + {116.483633,39.998935}, + {116.48367,39.998968}, + {116.484648,39.999861} + }; + + for (double[] doubles : arr) { + Thread.sleep(500); + String string = Arrays.toString(doubles); + System.out.println(string); + Thread.sleep(1000); + sendOneMessage(vin , string); + } + }catch (Exception e){ + log.info("【webSocket消息】 客户端 {} 连接失败",vin); + e.printStackTrace(); + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(){ + webSocketServers.remove(this); + map.remove(this.vin); + log.info("【websocket消息】连接断开 客户端id {} , 剩余客户端连接 {}",this.vin,webSocketServers.size()); + } + + /** + * 收到客户端消息后调用的方法 + * @param msg + */ + @OnMessage + public void onMessage(String msg){ + log.info("【webSocket消息】收到客户端消息:" + msg); + } + + /** + * 异常事件 + * @param throwable + */ + @OnError + public void onError(Throwable throwable){ + log.error("【webSocket消息】客户端错误 " + throwable.getMessage()); + throwable.printStackTrace(); + } + + /** + * 广播消息 所有客户端都能收到消息 + * @param msg + */ + public void sendAllMessage(String msg){ + log.info("【webSocket消息】服务端发起了广播消息:{}",msg); + webSocketServers.forEach(obj -> { + if (obj.session.isOpen()){ + obj.session.getAsyncRemote().sendText(msg); + } + }); + } + + /** + * 单客户端接收消息 + * @param vin + * @param msg + */ + public void sendOneMessage(String vin , String msg){ + log.info("【webSocket消息】向客户端 {} 发送消息 , 消息内容 {}",vin,msg); + Session session = map.get(vin); + if (null != session && session.isOpen()){ + session.getAsyncRemote().sendText(JSON.toJSONString(msg)); + } + } + + + /** + * 多个指定客户端接收消息 + * @param vinArr + * @param msg + */ + public void sendManyMessage(String [] vinArr,String msg){ + log.info("【webSocket消息】向客户端 {} 发送消息 , 消息内容 {}", Arrays.toString(vinArr),msg); + for (String vin : vinArr) { + Session session = map.get(vin); + session.getAsyncRemote().sendText(JSON.toJSONString(msg)); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + WebSocketServer that = (WebSocketServer) o; + return Objects.equals(session, that.session) && Objects.equals(vin, that.vin); + } + + @Override + public int hashCode() { + return Objects.hash(session, vin); + } +} diff --git a/car-business-server/src/main/resources/bootstrap.yml b/car-business-server/src/main/resources/bootstrap.yml index 32a1291..1da035f 100644 --- a/car-business-server/src/main/resources/bootstrap.yml +++ b/car-business-server/src/main/resources/bootstrap.yml @@ -1,7 +1,6 @@ # Tomcat server: port: 9804 - # Spring spring: application: @@ -23,6 +22,23 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + rabbitmq: + port: 5672 + host: 10.100.1.5 + username: guest + password: guest + #这个配置是保证提供者确保消息推送到交换机中,不管成不成功,都会回调 + publisher-confirm-type: correlated + #保证交换机能把消息推送到队列中 + publisher-returns: true + virtual-host: / + #这个配置是保证消费者会消费消息,手动确认 + listener: + simple: + acknowledge-mode: manual + template: + mandatory: true logging: level: com.god.system.mapper: DEBUG +