You need to sign in before continuing.
Commit 3b54deb989630f21b7313ac398b4e1f417172fe4
1 parent
61ea0948
【代码优化】IoT: 优化数据桥梁的执行器减少子类代码冗余
Showing
7 changed files
with
56 additions
and
55 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/AbstractCacheableDataBridgeExecute.java
| ... | ... | @@ -33,7 +33,7 @@ import java.time.Duration; |
| 33 | 33 | * @author HUIHUI |
| 34 | 34 | */ |
| 35 | 35 | @Slf4j |
| 36 | -public abstract class AbstractCacheableDataBridgeExecute<Config, Producer> implements IotDataBridgeExecute { | |
| 36 | +public abstract class AbstractCacheableDataBridgeExecute<Config, Producer> implements IotDataBridgeExecute<Config> { | |
| 37 | 37 | |
| 38 | 38 | /** |
| 39 | 39 | * Producer 缓存 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotDataBridgeExecute.java
| ... | ... | @@ -9,9 +9,14 @@ import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; |
| 9 | 9 | * |
| 10 | 10 | * @author HUIHUI |
| 11 | 11 | */ |
| 12 | -public interface IotDataBridgeExecute { | |
| 12 | +public interface IotDataBridgeExecute<Config> { | |
| 13 | 13 | |
| 14 | - // TODO @huihui:要不搞个 getType?然后 execute0 由子类实现。这样,子类的 executeRedisStream ,其实就是 execute0 了。 | |
| 14 | + /** | |
| 15 | + * 获取数据桥梁类型 | |
| 16 | + * | |
| 17 | + * @return 数据桥梁类型 | |
| 18 | + */ | |
| 19 | + Integer getType(); | |
| 15 | 20 | |
| 16 | 21 | /** |
| 17 | 22 | * 执行数据桥梁操作 |
| ... | ... | @@ -19,6 +24,23 @@ public interface IotDataBridgeExecute { |
| 19 | 24 | * @param message 设备消息 |
| 20 | 25 | * @param dataBridge 数据桥梁 |
| 21 | 26 | */ |
| 22 | - void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge); | |
| 27 | + @SuppressWarnings({"unchecked"}) | |
| 28 | + default void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge) { | |
| 29 | + // 1.1 校验数据桥梁类型 | |
| 30 | + if (!getType().equals(dataBridge.getType())) { | |
| 31 | + return; | |
| 32 | + } | |
| 33 | + | |
| 34 | + // 1.2 执行对应的数据桥梁发送消息 | |
| 35 | + execute0(message, (Config) dataBridge.getConfig()); | |
| 36 | + } | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * 【真正】执行数据桥梁操作 | |
| 40 | + * | |
| 41 | + * @param message 设备消息 | |
| 42 | + * @param config 桥梁配置 | |
| 43 | + */ | |
| 44 | + void execute0(IotDeviceMessage message, Config config); | |
| 23 | 45 | |
| 24 | 46 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotHttpDataBridgeExecute.java
| ... | ... | @@ -25,23 +25,19 @@ import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_ |
| 25 | 25 | */ |
| 26 | 26 | @Component |
| 27 | 27 | @Slf4j |
| 28 | -public class IotHttpDataBridgeExecute implements IotDataBridgeExecute { | |
| 28 | +public class IotHttpDataBridgeExecute implements IotDataBridgeExecute<IotDataBridgeDO.HttpConfig> { | |
| 29 | 29 | |
| 30 | 30 | @Resource |
| 31 | 31 | private RestTemplate restTemplate; |
| 32 | 32 | |
| 33 | 33 | @Override |
| 34 | - public void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge) { | |
| 35 | - // 1.1 校验数据桥梁的类型 == HTTP | |
| 36 | - if (!IotDataBridgTypeEnum.HTTP.getType().equals(dataBridge.getType())) { | |
| 37 | - return; | |
| 38 | - } | |
| 39 | - // 1.2 执行 HTTP 请求 | |
| 40 | - executeHttp(message, (IotDataBridgeDO.HttpConfig) dataBridge.getConfig()); | |
| 34 | + public Integer getType() { | |
| 35 | + return IotDataBridgTypeEnum.HTTP.getType(); | |
| 41 | 36 | } |
| 42 | 37 | |
| 38 | + @Override | |
| 43 | 39 | @SuppressWarnings({"unchecked", "deprecation"}) |
| 44 | - private void executeHttp(IotDeviceMessage message, IotDataBridgeDO.HttpConfig config) { | |
| 40 | + public void execute0(IotDeviceMessage message, IotDataBridgeDO.HttpConfig config) { | |
| 45 | 41 | String url = null; |
| 46 | 42 | HttpMethod method = HttpMethod.valueOf(config.getMethod().toUpperCase()); |
| 47 | 43 | HttpEntity<String> requestEntity = null; | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotKafkaMQDataBridgeExecute.java
| ... | ... | @@ -30,16 +30,12 @@ public class IotKafkaMQDataBridgeExecute extends |
| 30 | 30 | private static final Duration SEND_TIMEOUT = Duration.ofMillis(10); |
| 31 | 31 | |
| 32 | 32 | @Override |
| 33 | - public void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge) { | |
| 34 | - // 1. 校验数据桥梁的类型 == KAFKA | |
| 35 | - if (!IotDataBridgTypeEnum.KAFKA.getType().equals(dataBridge.getType())) { | |
| 36 | - return; | |
| 37 | - } | |
| 38 | - // 2. 执行 Kafka 发送消息 | |
| 39 | - executeKafka(message, (IotDataBridgeDO.KafkaMQConfig) dataBridge.getConfig()); | |
| 33 | + public Integer getType() { | |
| 34 | + return IotDataBridgTypeEnum.KAFKA.getType(); | |
| 40 | 35 | } |
| 41 | 36 | |
| 42 | - private void executeKafka(IotDeviceMessage message, IotDataBridgeDO.KafkaMQConfig config) { | |
| 37 | + @Override | |
| 38 | + public void execute0(IotDeviceMessage message, IotDataBridgeDO.KafkaMQConfig config) { | |
| 43 | 39 | try { |
| 44 | 40 | // 1. 获取或创建 KafkaTemplate |
| 45 | 41 | KafkaTemplate<String, String> kafkaTemplate = getProducer(config); |
| ... | ... | @@ -113,10 +109,10 @@ public class IotKafkaMQDataBridgeExecute extends |
| 113 | 109 | |
| 114 | 110 | // 4. 执行两次测试,验证缓存 |
| 115 | 111 | log.info("[main][第一次执行,应该会创建新的 producer]"); |
| 116 | - action.executeKafka(message, config); | |
| 112 | + action.execute0(message, config); | |
| 117 | 113 | |
| 118 | 114 | log.info("[main][第二次执行,应该会复用缓存的 producer]"); |
| 119 | - action.executeKafka(message, config); | |
| 115 | + action.execute0(message, config); | |
| 120 | 116 | } |
| 121 | 117 | |
| 122 | 118 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotRabbitMQDataBridgeExecute.java
| ... | ... | @@ -22,17 +22,14 @@ import java.time.LocalDateTime; |
| 22 | 22 | public class IotRabbitMQDataBridgeExecute extends |
| 23 | 23 | AbstractCacheableDataBridgeExecute<IotDataBridgeDO.RabbitMQConfig, Channel> { |
| 24 | 24 | |
| 25 | + | |
| 25 | 26 | @Override |
| 26 | - public void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge) { | |
| 27 | - // 1.1 校验数据桥梁的类型 == RABBITMQ | |
| 28 | - if (!IotDataBridgTypeEnum.RABBITMQ.getType().equals(dataBridge.getType())) { | |
| 29 | - return; | |
| 30 | - } | |
| 31 | - // 1.2 执行 RabbitMQ 发送消息 | |
| 32 | - executeRabbitMQ(message, (IotDataBridgeDO.RabbitMQConfig) dataBridge.getConfig()); | |
| 27 | + public Integer getType() { | |
| 28 | + return IotDataBridgTypeEnum.RABBITMQ.getType(); | |
| 33 | 29 | } |
| 34 | 30 | |
| 35 | - private void executeRabbitMQ(IotDeviceMessage message, IotDataBridgeDO.RabbitMQConfig config) { | |
| 31 | + @Override | |
| 32 | + public void execute0(IotDeviceMessage message, IotDataBridgeDO.RabbitMQConfig config) { | |
| 36 | 33 | try { |
| 37 | 34 | // 1. 获取或创建 Channel |
| 38 | 35 | Channel channel = getProducer(config); |
| ... | ... | @@ -111,10 +108,10 @@ public class IotRabbitMQDataBridgeExecute extends |
| 111 | 108 | |
| 112 | 109 | // 4. 执行两次测试,验证缓存 |
| 113 | 110 | log.info("[main][第一次执行,应该会创建新的 channel]"); |
| 114 | - action.executeRabbitMQ(message, config); | |
| 111 | + action.execute0(message, config); | |
| 115 | 112 | |
| 116 | 113 | log.info("[main][第二次执行,应该会复用缓存的 channel]"); |
| 117 | - action.executeRabbitMQ(message, config); | |
| 114 | + action.execute0(message, config); | |
| 118 | 115 | } |
| 119 | 116 | |
| 120 | 117 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotRedisStreamMQDataBridgeExecute.java
| ... | ... | @@ -33,18 +33,12 @@ public class IotRedisStreamMQDataBridgeExecute extends |
| 33 | 33 | AbstractCacheableDataBridgeExecute<IotDataBridgeDO.RedisStreamMQConfig, RedisTemplate<String, Object>> { |
| 34 | 34 | |
| 35 | 35 | @Override |
| 36 | - public void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge) { | |
| 37 | - // 1.1 校验数据桥梁类型 | |
| 38 | - if (!IotDataBridgTypeEnum.REDIS_STREAM.getType().equals(dataBridge.getType())) { | |
| 39 | - return; | |
| 40 | - } | |
| 41 | - // 1.2 执行消息发送 | |
| 42 | - executeRedisStream(message, (IotDataBridgeDO.RedisStreamMQConfig) dataBridge.getConfig()); | |
| 36 | + public Integer getType() { | |
| 37 | + return IotDataBridgTypeEnum.REDIS_STREAM.getType(); | |
| 43 | 38 | } |
| 44 | 39 | |
| 45 | - @SuppressWarnings("unchecked") | |
| 46 | - // TODO @huihui:try catch 交给父类来做,子类不处理异常 | |
| 47 | - private void executeRedisStream(IotDeviceMessage message, IotDataBridgeDO.RedisStreamMQConfig config) { | |
| 40 | + @Override | |
| 41 | + public void execute0(IotDeviceMessage message, IotDataBridgeDO.RedisStreamMQConfig config) { | |
| 48 | 42 | try { |
| 49 | 43 | // 1. 获取 RedisTemplate |
| 50 | 44 | RedisTemplate<String, Object> redisTemplate = getProducer(config); |
| ... | ... | @@ -133,10 +127,10 @@ public class IotRedisStreamMQDataBridgeExecute extends |
| 133 | 127 | |
| 134 | 128 | // 4. 执行两次测试,验证缓存 |
| 135 | 129 | log.info("[main][第一次执行,应该会创建新的 RedisTemplate]"); |
| 136 | - action.executeRedisStream(message, config); | |
| 130 | + action.execute0(message, config); | |
| 137 | 131 | |
| 138 | 132 | log.info("[main][第二次执行,应该会复用缓存的 RedisTemplate]"); |
| 139 | - action.executeRedisStream(message, config); | |
| 133 | + action.execute0(message, config); | |
| 140 | 134 | } |
| 141 | 135 | |
| 142 | 136 | } |
| 143 | 137 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/databridge/IotRocketMQDataBridgeExecute.java
| ... | ... | @@ -24,16 +24,12 @@ public class IotRocketMQDataBridgeExecute extends |
| 24 | 24 | AbstractCacheableDataBridgeExecute<IotDataBridgeDO.RocketMQConfig, DefaultMQProducer> { |
| 25 | 25 | |
| 26 | 26 | @Override |
| 27 | - public void execute(IotDeviceMessage message, IotDataBridgeDO dataBridge) { | |
| 28 | - // 1.1 校验数据桥梁的类型 == ROCKETMQ | |
| 29 | - if (!IotDataBridgTypeEnum.ROCKETMQ.getType().equals(dataBridge.getType())) { | |
| 30 | - return; | |
| 31 | - } | |
| 32 | - // 1.2 执行 RocketMQ 发送消息 | |
| 33 | - executeRocketMQ(message, (IotDataBridgeDO.RocketMQConfig) dataBridge.getConfig()); | |
| 27 | + public Integer getType() { | |
| 28 | + return IotDataBridgTypeEnum.ROCKETMQ.getType(); | |
| 34 | 29 | } |
| 35 | 30 | |
| 36 | - private void executeRocketMQ(IotDeviceMessage message, IotDataBridgeDO.RocketMQConfig config) { | |
| 31 | + @Override | |
| 32 | + public void execute0(IotDeviceMessage message, IotDataBridgeDO.RocketMQConfig config) { | |
| 37 | 33 | try { |
| 38 | 34 | // 1. 获取或创建 Producer |
| 39 | 35 | DefaultMQProducer producer = getProducer(config); |
| ... | ... | @@ -97,10 +93,10 @@ public class IotRocketMQDataBridgeExecute extends |
| 97 | 93 | |
| 98 | 94 | // 4. 执行两次测试,验证缓存 |
| 99 | 95 | log.info("[main][第一次执行,应该会创建新的 producer]"); |
| 100 | - action.executeRocketMQ(message, config); | |
| 96 | + action.execute0(message, config); | |
| 101 | 97 | |
| 102 | 98 | log.info("[main][第二次执行,应该会复用缓存的 producer]"); |
| 103 | - action.executeRocketMQ(message, config); | |
| 99 | + action.execute0(message, config); | |
| 104 | 100 | } |
| 105 | 101 | |
| 106 | 102 | } | ... | ... |