Commit 6639d371328a51bdc70ea43e09d74f35f3d6af0e
1 parent
e9a99c1e
【代码评审】IoT:整体实现
Showing
4 changed files
with
37 additions
and
29 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/rule/IotRuleSceneJob.java
| 1 | package cn.iocoder.yudao.module.iot.job.rule; | 1 | package cn.iocoder.yudao.module.iot.job.rule; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.map.MapUtil; | ||
| 3 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; | 4 | import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; |
| 4 | import cn.iocoder.yudao.module.iot.service.rule.IotRuleSceneService; | 5 | import cn.iocoder.yudao.module.iot.service.rule.IotRuleSceneService; |
| 5 | import jakarta.annotation.Resource; | 6 | import jakarta.annotation.Resource; |
| @@ -41,7 +42,7 @@ public class IotRuleSceneJob extends QuartzJobBean { | @@ -41,7 +42,7 @@ public class IotRuleSceneJob extends QuartzJobBean { | ||
| 41 | * @return JobData Map | 42 | * @return JobData Map |
| 42 | */ | 43 | */ |
| 43 | public static Map<String, Object> buildJobDataMap(Long ruleSceneId) { | 44 | public static Map<String, Object> buildJobDataMap(Long ruleSceneId) { |
| 44 | - return Map.of(JOB_DATA_KEY_RULE_SCENE_ID, ruleSceneId); | 45 | + return MapUtil.of(JOB_DATA_KEY_RULE_SCENE_ID, ruleSceneId); |
| 45 | } | 46 | } |
| 46 | 47 | ||
| 47 | /** | 48 | /** |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceGroupService.java
| 1 | package cn.iocoder.yudao.module.iot.service.device; | 1 | package cn.iocoder.yudao.module.iot.service.device; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.hutool.core.collection.ListUtil; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.group.IotDeviceGroupPageReqVO; | 6 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.group.IotDeviceGroupPageReqVO; |
| 6 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.group.IotDeviceGroupSaveReqVO; | 7 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.group.IotDeviceGroupSaveReqVO; |
| @@ -48,7 +49,7 @@ public interface IotDeviceGroupService { | @@ -48,7 +49,7 @@ public interface IotDeviceGroupService { | ||
| 48 | */ | 49 | */ |
| 49 | default List<IotDeviceGroupDO> validateDeviceGroupExists(Collection<Long> ids) { | 50 | default List<IotDeviceGroupDO> validateDeviceGroupExists(Collection<Long> ids) { |
| 50 | if (CollUtil.isEmpty(ids)) { | 51 | if (CollUtil.isEmpty(ids)) { |
| 51 | - return List.of(); | 52 | + return ListUtil.empty(); |
| 52 | } | 53 | } |
| 53 | return convertList(ids, this::validateDeviceGroupExists); | 54 | return convertList(ids, this::validateDeviceGroupExists); |
| 54 | } | 55 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/data/IotDeviceLogServiceImpl.java
| 1 | package cn.iocoder.yudao.module.iot.service.device.data; | 1 | package cn.iocoder.yudao.module.iot.service.device.data; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.date.LocalDateTimeUtil; | 3 | import cn.hutool.core.date.LocalDateTimeUtil; |
| 4 | +import cn.hutool.core.map.MapUtil; | ||
| 4 | import cn.hutool.core.util.IdUtil; | 5 | import cn.hutool.core.util.IdUtil; |
| 5 | import cn.hutool.core.util.StrUtil; | 6 | import cn.hutool.core.util.StrUtil; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| @@ -87,7 +88,7 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | @@ -87,7 +88,7 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | ||
| 87 | Long timeMillis = timestamp.getTime(); | 88 | Long timeMillis = timestamp.getTime(); |
| 88 | // 消息数量转换 | 89 | // 消息数量转换 |
| 89 | Integer count = ((Number) map.get("data")).intValue(); | 90 | Integer count = ((Number) map.get("data")).intValue(); |
| 90 | - return Map.of(timeMillis, count); | 91 | + return MapUtil.of(timeMillis, count); |
| 91 | }) | 92 | }) |
| 92 | .collect(Collectors.toList()); | 93 | .collect(Collectors.toList()); |
| 93 | } | 94 | } |
| @@ -103,7 +104,7 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | @@ -103,7 +104,7 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | ||
| 103 | Long timeMillis = timestamp.getTime(); | 104 | Long timeMillis = timestamp.getTime(); |
| 104 | // 消息数量转换 | 105 | // 消息数量转换 |
| 105 | Integer count = ((Number) map.get("data")).intValue(); | 106 | Integer count = ((Number) map.get("data")).intValue(); |
| 106 | - return Map.of(timeMillis, count); | 107 | + return MapUtil.of(timeMillis, count); |
| 107 | }) | 108 | }) |
| 108 | .collect(Collectors.toList()); | 109 | .collect(Collectors.toList()); |
| 109 | } | 110 | } |
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-emqx/src/main/java/cn/iocoder/yudao/module/iot/plugin/emqx/upstream/IotDeviceUpstreamServer.java
| @@ -85,11 +85,12 @@ public class IotDeviceUpstreamServer { | @@ -85,11 +85,12 @@ public class IotDeviceUpstreamServer { | ||
| 85 | } | 85 | } |
| 86 | log.info("[start][开始启动服务]"); | 86 | log.info("[start][开始启动服务]"); |
| 87 | 87 | ||
| 88 | + // TODO @haohao:建议先启动 MQTT Broker,再启动 HTTP Server。类似 jdbc 先连接了,在启动 tomcat 的味道 | ||
| 88 | // 1. 启动 HTTP 服务器 | 89 | // 1. 启动 HTTP 服务器 |
| 89 | CompletableFuture<Void> httpFuture = server.listen(emqxProperties.getAuthPort()) | 90 | CompletableFuture<Void> httpFuture = server.listen(emqxProperties.getAuthPort()) |
| 90 | .toCompletionStage() | 91 | .toCompletionStage() |
| 91 | .toCompletableFuture() | 92 | .toCompletableFuture() |
| 92 | - .thenAccept(v -> log.info("[start][HTTP服务器启动完成,端口: {}]", server.actualPort())); | 93 | + .thenAccept(v -> log.info("[start][HTTP 服务器启动完成,端口: {}]", server.actualPort())); |
| 93 | 94 | ||
| 94 | // 2. 连接 MQTT Broker | 95 | // 2. 连接 MQTT Broker |
| 95 | CompletableFuture<Void> mqttFuture = connectMqtt() | 96 | CompletableFuture<Void> mqttFuture = connectMqtt() |
| @@ -98,16 +99,16 @@ public class IotDeviceUpstreamServer { | @@ -98,16 +99,16 @@ public class IotDeviceUpstreamServer { | ||
| 98 | .thenAccept(v -> { | 99 | .thenAccept(v -> { |
| 99 | // 2.1 添加 MQTT 断开重连监听器 | 100 | // 2.1 添加 MQTT 断开重连监听器 |
| 100 | client.closeHandler(closeEvent -> { | 101 | client.closeHandler(closeEvent -> { |
| 101 | - log.warn("[closeHandler][MQTT连接已断开,准备重连]"); | 102 | + log.warn("[closeHandler][MQTT 连接已断开,准备重连]"); |
| 102 | reconnectWithDelay(); | 103 | reconnectWithDelay(); |
| 103 | }); | 104 | }); |
| 104 | - // 2. 设置 MQTT 消息处理器 | 105 | + // 2.2 设置 MQTT 消息处理器 |
| 105 | setupMessageHandler(); | 106 | setupMessageHandler(); |
| 106 | }); | 107 | }); |
| 107 | 108 | ||
| 108 | // 3. 等待所有服务启动完成 | 109 | // 3. 等待所有服务启动完成 |
| 109 | CompletableFuture.allOf(httpFuture, mqttFuture) | 110 | CompletableFuture.allOf(httpFuture, mqttFuture) |
| 110 | - .orTimeout(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS) | 111 | + .orTimeout(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS) // TODO @芋艿:JDK8 不兼容 |
| 111 | .whenComplete((result, error) -> { | 112 | .whenComplete((result, error) -> { |
| 112 | if (error != null) { | 113 | if (error != null) { |
| 113 | log.error("[start][服务启动失败]", error); | 114 | log.error("[start][服务启动失败]", error); |
| @@ -123,7 +124,7 @@ public class IotDeviceUpstreamServer { | @@ -123,7 +124,7 @@ public class IotDeviceUpstreamServer { | ||
| 123 | */ | 124 | */ |
| 124 | private void setupMessageHandler() { | 125 | private void setupMessageHandler() { |
| 125 | client.publishHandler(mqttMessageHandler::handle); | 126 | client.publishHandler(mqttMessageHandler::handle); |
| 126 | - log.debug("[setupMessageHandler][MQTT消息处理器设置完成]"); | 127 | + log.debug("[setupMessageHandler][MQTT 消息处理器设置完成]"); |
| 127 | } | 128 | } |
| 128 | 129 | ||
| 129 | /** | 130 | /** |
| @@ -203,26 +204,30 @@ public class IotDeviceUpstreamServer { | @@ -203,26 +204,30 @@ public class IotDeviceUpstreamServer { | ||
| 203 | isRunning = false; | 204 | isRunning = false; |
| 204 | 205 | ||
| 205 | try { | 206 | try { |
| 206 | - CompletableFuture<Void> serverFuture = server != null | ||
| 207 | - ? server.close().toCompletionStage().toCompletableFuture() | ||
| 208 | - : CompletableFuture.completedFuture(null); | ||
| 209 | - CompletableFuture<Void> clientFuture = client != null | ||
| 210 | - ? client.disconnect().toCompletionStage().toCompletableFuture() | ||
| 211 | - : CompletableFuture.completedFuture(null); | ||
| 212 | - CompletableFuture<Void> vertxFuture = vertx != null | ||
| 213 | - ? vertx.close().toCompletionStage().toCompletableFuture() | ||
| 214 | - : CompletableFuture.completedFuture(null); | ||
| 215 | - | ||
| 216 | - // 等待所有资源关闭 | ||
| 217 | - CompletableFuture.allOf(serverFuture, clientFuture, vertxFuture) | ||
| 218 | - .orTimeout(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS) | ||
| 219 | - .whenComplete((result, error) -> { | ||
| 220 | - if (error != null) { | ||
| 221 | - log.error("[stop][服务关闭过程中发生异常]", error); | ||
| 222 | - } else { | ||
| 223 | - log.info("[stop][所有服务关闭完成]"); | ||
| 224 | - } | ||
| 225 | - }); | 207 | + // 关闭 HTTP 服务器 |
| 208 | + if (server != null) { | ||
| 209 | + server.close() | ||
| 210 | + .toCompletionStage() | ||
| 211 | + .toCompletableFuture() | ||
| 212 | + .join(); | ||
| 213 | + } | ||
| 214 | + | ||
| 215 | + // 关闭 MQTT 客户端 | ||
| 216 | + if (client != null) { | ||
| 217 | + client.disconnect() | ||
| 218 | + .toCompletionStage() | ||
| 219 | + .toCompletableFuture() | ||
| 220 | + .join(); | ||
| 221 | + } | ||
| 222 | + | ||
| 223 | + // 关闭 Vertx 实例 | ||
| 224 | + if (vertx!= null) { | ||
| 225 | + vertx.close() | ||
| 226 | + .toCompletionStage() | ||
| 227 | + .toCompletableFuture() | ||
| 228 | + .join(); | ||
| 229 | + } | ||
| 230 | + log.info("[stop][关闭完成]"); | ||
| 226 | } catch (Exception e) { | 231 | } catch (Exception e) { |
| 227 | log.error("[stop][关闭服务异常]", e); | 232 | log.error("[stop][关闭服务异常]", e); |
| 228 | throw new RuntimeException("关闭 IoT 设备上行服务失败", e); | 233 | throw new RuntimeException("关闭 IoT 设备上行服务失败", e); |