From 7e8eb968c0ae07c83ab6252ac314d0c8cd5bbebb Mon Sep 17 00:00:00 2001 From: gtl <2949451835@qq.com> Date: Mon, 13 May 2024 16:24:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9Emq=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E7=89=88=E6=9C=AC=E5=86=85=E5=AE=B9=E5=92=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-auth/src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../ruoyi-data_asset-common/pom.xml | 2 + .../constant/QueueNameConstants.java | 13 +++ .../ruoyi-data_asset-server/pom.xml | 7 ++ .../config/ConfirmFallbackConfig.java | 51 +++++++++++ .../dataAsset/config/RabbitAdminConfig.java | 53 ++++++++++++ .../dataAsset/config/RabbitmqConfig.java | 16 ++++ .../config/ReturnsFallbackConfig.java | 44 ++++++++++ .../ruoyi/dataAsset/queue/NormalQueue.java | 26 ++++++ .../service/impl/DataSourceServiceImpl.java | 33 ++++++++ .../src/main/resources/bootstrap.yml | 4 +- .../ruoyi-data_transform-server/pom.xml | 7 ++ .../config/ConfirmFallbackConfig.java | 51 +++++++++++ .../config/RabbitAdminConfig.java | 53 ++++++++++++ .../dataTransform/config/RabbitmqConfig.java | 16 ++++ .../config/ReturnsFallbackConfig.java | 44 ++++++++++ .../consumer/DataSourceConsumer.java | 84 +++++++++++++++++++ .../consumer/EngineVersionConsumer.java | 73 ++++++++++++++++ .../impl/EngineOperationServiceImpl.java | 32 +++++-- .../src/main/resources/bootstrap.yml | 6 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../config/RuleEngineApplicationRunner.java | 7 +- .../context/DataModelContextHolder.java | 4 +- .../{ActionDiscard.java => ActionIgnore.java} | 6 +- .../client/engine/action/ActionRecords.java | 10 +++ .../client/engine/action/ActionRemove.java | 10 +++ ...extHolderUtil.java => RuleEngineUtil.java} | 16 +++- .../constant/QueueNameConstants.java | 13 +++ .../ruoyi-rule_engine-server/pom.xml | 7 ++ .../config/ConfirmFallbackConfig.java | 51 +++++++++++ .../ruleEngine/config/RabbitAdminConfig.java | 53 ++++++++++++ .../ruleEngine/config/RabbitmqConfig.java | 16 ++++ .../config/ReturnsFallbackConfig.java | 44 ++++++++++ .../controller/EngineVersionController.java | 2 +- .../ruoyi/ruleEngine/queue/NormalQueue.java | 26 ++++++ .../service/EngineVersionService.java | 7 ++ .../impl/EngineVersionServiceImpl.java | 32 +++++++ .../src/main/resources/bootstrap.yml | 4 +- .../resources/file/DataModelContextHolder.txt | 2 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- 44 files changed, 912 insertions(+), 41 deletions(-) create mode 100644 ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/src/main/java/com/ruoyi/dataAsset/constant/QueueNameConstants.java create mode 100644 ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ConfirmFallbackConfig.java create mode 100644 ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitAdminConfig.java create mode 100644 ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitmqConfig.java create mode 100644 ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ReturnsFallbackConfig.java create mode 100644 ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/queue/NormalQueue.java create mode 100644 ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ConfirmFallbackConfig.java create mode 100644 ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitAdminConfig.java create mode 100644 ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitmqConfig.java create mode 100644 ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ReturnsFallbackConfig.java create mode 100644 ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/DataSourceConsumer.java create mode 100644 ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/EngineVersionConsumer.java rename ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/{ActionDiscard.java => ActionIgnore.java} (53%) create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRecords.java create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRemove.java rename ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/util/{ScopeContextHolderUtil.java => RuleEngineUtil.java} (75%) create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-common/src/main/java/com/ruoyi/ruleEngine/constant/QueueNameConstants.java create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ConfirmFallbackConfig.java create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitAdminConfig.java create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitmqConfig.java create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ReturnsFallbackConfig.java create mode 100644 ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/queue/NormalQueue.java diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index 89831f9..4aadb9d 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index 4a7a653..1638fc9 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/pom.xml b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/pom.xml index 4ce2370..55d2d05 100644 --- a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/pom.xml +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/pom.xml @@ -31,5 +31,7 @@ 1.2.20 compile + + diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/src/main/java/com/ruoyi/dataAsset/constant/QueueNameConstants.java b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/src/main/java/com/ruoyi/dataAsset/constant/QueueNameConstants.java new file mode 100644 index 0000000..2b75f8c --- /dev/null +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-common/src/main/java/com/ruoyi/dataAsset/constant/QueueNameConstants.java @@ -0,0 +1,13 @@ +package com.ruoyi.dataAsset.constant; + +/** + * 队列名称常量 + * @ClassName QueueNameConstants + * @Author 森静若林 + */ +public class QueueNameConstants { + + //发送短消息队列名称 + public static final String DATASOURCE_MESSAGE = "send_datasource_message"; + +} diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/pom.xml b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/pom.xml index 2a80104..46aa368 100644 --- a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/pom.xml +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/pom.xml @@ -99,6 +99,13 @@ mssql-jdbc 9.4.0.jre8 + + + + org.springframework.boot + spring-boot-starter-amqp + 2.6.2 + diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ConfirmFallbackConfig.java b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ConfirmFallbackConfig.java new file mode 100644 index 0000000..ec2c431 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ConfirmFallbackConfig.java @@ -0,0 +1,51 @@ +package com.ruoyi.dataAsset.config; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送到 broker 的确认 + * @ClassName: ConfirmFallbackConfig + * @Author: 森静若林 + * @Date: 2024/1/15 + */ + +@Log4j2 +@Component +public class ConfirmFallbackConfig implements RabbitTemplate.ConfirmCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * ConfirmFallbackConfig 初始化的时候执行 设置 rabbitTemplate 发送的回调是 当前类 对象 + */ + @PostConstruct + public void init() { + this.rabbitTemplate.setConfirmCallback(this); + } + + /** + * 消息发送到 broker的回调方法 消息发送成功或者失败都会执行这个方法 + * @param correlationData correlation data for the callback. + * @param ack true for ack, false for nack + * @param cause An optional cause, for nack, when available, otherwise null. + */ + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + if (ack) { + // 消息发送成功 + log.info("消息发送成功"); + } else { + // 消息发送是吧 + log.info("消息发送失败,错误原因:{}", cause); + // 获取到发送失败消息的内容 + } + } + +} diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitAdminConfig.java b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitAdminConfig.java new file mode 100644 index 0000000..e04fbe2 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitAdminConfig.java @@ -0,0 +1,53 @@ +package com.ruoyi.dataAsset.config; + +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * RabbitAdmin是RabbitMQ的一个Java客户端库,它提供了管理RabbitMQ资源的功能。它是通过与RabbitMQ服务器进行交互来执行管理操作的。 + */ +@Configuration +public class RabbitAdminConfig { + + @Value("${spring.rabbitmq.host}") + private String host; + @Value("${spring.rabbitmq.username}") + private String username; + @Value("${spring.rabbitmq.password}") + private String password; + @Value("${spring.rabbitmq.virtualhost}") + private String virtualhost; + + /** + * 构建 RabbitMQ的连接工厂 + * @return + */ + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); + connectionFactory.setAddresses(host); + connectionFactory.setUsername(username); + connectionFactory.setPassword(password); + connectionFactory.setVirtualHost(virtualhost); + // 配置发送确认回调时,次配置必须配置,否则即使在RabbitTemplate配置了ConfirmCallback也不会生效 + connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); + connectionFactory.setPublisherReturns(true); + return connectionFactory; + } + + /** + * 自己初始化 RabbitAdmin + * @param connectionFactory + * @return + */ + @Bean + public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) { + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + rabbitAdmin.setAutoStartup(true); + return rabbitAdmin; + } +} diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitmqConfig.java b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitmqConfig.java new file mode 100644 index 0000000..9725d40 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/RabbitmqConfig.java @@ -0,0 +1,16 @@ +package com.ruoyi.dataAsset.config; + +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitmqConfig { + // 消息转换配置 + @Bean + public MessageConverter jsonMessageConverter(){ + return new Jackson2JsonMessageConverter(); + } + +} diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ReturnsFallbackConfig.java b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ReturnsFallbackConfig.java new file mode 100644 index 0000000..777b138 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/config/ReturnsFallbackConfig.java @@ -0,0 +1,44 @@ +package com.ruoyi.dataAsset.config; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送打 队列的回调 + * @ClassName: ConfirmFallbackConfig + * @Author: 森静若林 + * @Date: 2024/1/15 + */ +@Log4j2 +@Component +public class ReturnsFallbackConfig implements RabbitTemplate.ReturnsCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * 设置 rabbitTemplate 发送消息到 队列的 回调 使用 ReturnsFallbackConfig + */ + @PostConstruct + public void init() { + this.rabbitTemplate.setReturnsCallback(this); + } + + /** + * 消息发送到队列失败的回调 + * @param returned the returned message and metadata. + */ + @Override + public void returnedMessage(ReturnedMessage returned) { + log.info("消息内容:{},被交换机:{}退回,退回的原因:{}", + returned.getMessage().toString(), returned.getExchange(), returned.getReplyText()); + // TODO 将发送到队列失败的消息 存入到 mysql | redis 后续可以进行补救 或者 先关处理 + } + + +} diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/queue/NormalQueue.java b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/queue/NormalQueue.java new file mode 100644 index 0000000..88d5abc --- /dev/null +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/queue/NormalQueue.java @@ -0,0 +1,26 @@ +package com.ruoyi.dataAsset.queue; + +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.UUID; + +/** + * @ClassName NormalQueue + * @Description 普通的队列 + * @Author 森静若林 + * @Date 2024/1/16 18:38 + */ +@Component +public class NormalQueue { + + @Autowired + private RabbitTemplate rabbitTemplate; + + public void sendUUIDMsg(String queueName,T msg){ + rabbitTemplate.convertAndSend(queueName,msg,message -> { + message.getMessageProperties().setMessageId(UUID.randomUUID().toString()); + return message; + }); + } +} diff --git a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/service/impl/DataSourceServiceImpl.java b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/service/impl/DataSourceServiceImpl.java index 7f0d9db..ce1c0e8 100644 --- a/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/service/impl/DataSourceServiceImpl.java +++ b/ruoyi-modules/ruoyi-data_asset/ruoyi-data_asset-server/src/main/java/com/ruoyi/dataAsset/service/impl/DataSourceServiceImpl.java @@ -11,9 +11,11 @@ import com.ruoyi.common.core.utils.ObjUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.dataAsset.config.DruidDataSourceFactory; +import com.ruoyi.dataAsset.constant.QueueNameConstants; import com.ruoyi.dataAsset.domain.AssetModelData; import com.ruoyi.dataAsset.domain.ColumnInfo; import com.ruoyi.dataAsset.domain.TableInfo; +import com.ruoyi.dataAsset.queue.NormalQueue; import com.ruoyi.dataAsset.service.AssetModelDataService; import com.ruoyi.dataAsset.service.ColumnInfoService; import com.ruoyi.dataAsset.service.TableInfoService; @@ -50,6 +52,9 @@ public class DataSourceServiceImpl extends ServiceImpl{ + this.renewalDataSource(dataSource); + }); //如果为不可用修改为可用 if(dataSource.getStatus().equals("N")){ dataSource.setStatus("Y"); @@ -308,4 +317,28 @@ public class DataSourceServiceImpl extends ServiceImplruoyi-data_transform-common 3.6.3 + + + + org.springframework.boot + spring-boot-starter-amqp + 2.6.2 + diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ConfirmFallbackConfig.java b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ConfirmFallbackConfig.java new file mode 100644 index 0000000..d2084ba --- /dev/null +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ConfirmFallbackConfig.java @@ -0,0 +1,51 @@ +package com.ruoyi.dataTransform.config; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送到 broker 的确认 + * @ClassName: ConfirmFallbackConfig + * @Author: 森静若林 + * @Date: 2024/1/15 + */ + +@Log4j2 +@Component +public class ConfirmFallbackConfig implements RabbitTemplate.ConfirmCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * ConfirmFallbackConfig 初始化的时候执行 设置 rabbitTemplate 发送的回调是 当前类 对象 + */ + @PostConstruct + public void init() { + this.rabbitTemplate.setConfirmCallback(this); + } + + /** + * 消息发送到 broker的回调方法 消息发送成功或者失败都会执行这个方法 + * @param correlationData correlation data for the callback. + * @param ack true for ack, false for nack + * @param cause An optional cause, for nack, when available, otherwise null. + */ + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + if (ack) { + // 消息发送成功 + log.info("消息发送成功"); + } else { + // 消息发送是吧 + log.info("消息发送失败,错误原因:{}", cause); + // 获取到发送失败消息的内容 + } + } + +} diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitAdminConfig.java b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitAdminConfig.java new file mode 100644 index 0000000..cdbe0b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitAdminConfig.java @@ -0,0 +1,53 @@ +package com.ruoyi.dataTransform.config; + +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * RabbitAdmin是RabbitMQ的一个Java客户端库,它提供了管理RabbitMQ资源的功能。它是通过与RabbitMQ服务器进行交互来执行管理操作的。 + */ +@Configuration +public class RabbitAdminConfig { + + @Value("${spring.rabbitmq.host}") + private String host; + @Value("${spring.rabbitmq.username}") + private String username; + @Value("${spring.rabbitmq.password}") + private String password; + @Value("${spring.rabbitmq.virtualhost}") + private String virtualhost; + + /** + * 构建 RabbitMQ的连接工厂 + * @return + */ + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); + connectionFactory.setAddresses(host); + connectionFactory.setUsername(username); + connectionFactory.setPassword(password); + connectionFactory.setVirtualHost(virtualhost); + // 配置发送确认回调时,次配置必须配置,否则即使在RabbitTemplate配置了ConfirmCallback也不会生效 + connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); + connectionFactory.setPublisherReturns(true); + return connectionFactory; + } + + /** + * 自己初始化 RabbitAdmin + * @param connectionFactory + * @return + */ + @Bean + public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) { + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + rabbitAdmin.setAutoStartup(true); + return rabbitAdmin; + } +} diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitmqConfig.java b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitmqConfig.java new file mode 100644 index 0000000..6c493a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/RabbitmqConfig.java @@ -0,0 +1,16 @@ +package com.ruoyi.dataTransform.config; + +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitmqConfig { + // 消息转换配置 + @Bean + public MessageConverter jsonMessageConverter(){ + return new Jackson2JsonMessageConverter(); + } + +} diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ReturnsFallbackConfig.java b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ReturnsFallbackConfig.java new file mode 100644 index 0000000..a29026f --- /dev/null +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/config/ReturnsFallbackConfig.java @@ -0,0 +1,44 @@ +package com.ruoyi.dataTransform.config; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送打 队列的回调 + * @ClassName: ConfirmFallbackConfig + * @Author: 森静若林 + * @Date: 2024/1/15 + */ +@Log4j2 +@Component +public class ReturnsFallbackConfig implements RabbitTemplate.ReturnsCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * 设置 rabbitTemplate 发送消息到 队列的 回调 使用 ReturnsFallbackConfig + */ + @PostConstruct + public void init() { + this.rabbitTemplate.setReturnsCallback(this); + } + + /** + * 消息发送到队列失败的回调 + * @param returned the returned message and metadata. + */ + @Override + public void returnedMessage(ReturnedMessage returned) { + log.info("消息内容:{},被交换机:{}退回,退回的原因:{}", + returned.getMessage().toString(), returned.getExchange(), returned.getReplyText()); + // TODO 将发送到队列失败的消息 存入到 mysql | redis 后续可以进行补救 或者 先关处理 + } + + +} diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/DataSourceConsumer.java b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/DataSourceConsumer.java new file mode 100644 index 0000000..e74b700 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/DataSourceConsumer.java @@ -0,0 +1,84 @@ +package com.ruoyi.dataTransform.consumer; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.fastjson2.JSON; +import com.rabbitmq.client.Channel; +import com.ruoyi.dataAsset.config.DruidDataSourceFactory; +import com.ruoyi.dataAsset.constant.QueueNameConstants; +import com.ruoyi.dataAsset.domain.DataSource; +import com.ruoyi.dataAsset.util.DataSourceUtil; +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * 数据源消费者 + * @ClassName: DataSourceConsumer + * @Author: 森静若林 + * @Date: 2024/5/13 + */ +@Log4j2 +@Component +public class DataSourceConsumer { + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private DruidDataSourceFactory druidDataSourceFactory; + + @Autowired + private MessageConverter messageConverter; + + /** + * 监听数据源队列取出消息消费 + */ + @RabbitListener(queuesToDeclare = {@Queue(name = QueueNameConstants.DATASOURCE_MESSAGE)}) + public void smsConsumer(Message message, Channel channel) { + DataSource dataSource = (DataSource) messageConverter.fromMessage(message); + log.info("数据源消费者接收到消息,消息内容:{}", JSON.toJSONString(dataSource)); + // 获取消息的id + String messageId = message.getMessageProperties().getMessageId(); + try { + Long count = redisTemplate.opsForSet().add(QueueNameConstants.DATASOURCE_MESSAGE, messageId); + if (count > 0) { + // 正常消费消息 + DruidDataSource druidDataSource = DataSourceUtil.createDataSource(dataSource); + // 新增或替换数据源 + Long id = dataSource.getId(); + if(druidDataSourceFactory.getMap().containsKey(id)){ + // 获取旧的 + DruidDataSource source = druidDataSourceFactory.get(id); + // 替换 + druidDataSourceFactory.put(id,druidDataSource); + // 关闭旧的 + source.close(); + }else { + //新增 + druidDataSourceFactory.put(id, druidDataSource); + } + // 消费成功 手动确认 + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + log.info("数据源消费者接收到消息,消息内容:{},消费消息成功!", JSON.toJSONString(dataSource)); + } + } catch (Exception ex) { + log.error("数据源消费者接收到消息,消息内容:{},消费消息失败,错误信息:{}", JSON.toJSONString(dataSource), ex.getMessage()); + // 删除 redis中 添加的消息的id, + redisTemplate.opsForSet().remove(QueueNameConstants.DATASOURCE_MESSAGE, messageId); + // 回退消息 + try { + channel.basicReject(message.getMessageProperties().getDeliveryTag(), true); + } catch (IOException e) { + log.error("数据源消费者接收到消息,消息内容:{},消费回退失败,错误信息:{}", JSON.toJSONString(dataSource), e.getMessage()); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/EngineVersionConsumer.java b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/EngineVersionConsumer.java new file mode 100644 index 0000000..d87eee1 --- /dev/null +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/consumer/EngineVersionConsumer.java @@ -0,0 +1,73 @@ +package com.ruoyi.dataTransform.consumer; + +import com.alibaba.fastjson2.JSON; +import com.rabbitmq.client.Channel; +import com.ruoyi.ruleEngine.client.config.RuleEngineVersionFactory; +import com.ruoyi.ruleEngine.client.util.RuleEngineUtil; +import com.ruoyi.ruleEngine.constant.QueueNameConstants; +import com.ruoyi.ruleEngine.domain.EngineVersion; +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import java.io.IOException; +import java.util.Map; + +/** + * 引擎版本消费者 + * @ClassName: EngineVersionConsumer + * @Author: 森静若林 + * @Date: 2024/5/13 + */ +@Log4j2 +@Component +public class EngineVersionConsumer { + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private RuleEngineVersionFactory ruleEngineVersionFactory; + + @Autowired + private MessageConverter messageConverter; + + /** + * 监听短信队列取出引擎版本消费 + */ + @RabbitListener(queuesToDeclare = {@Queue(name = QueueNameConstants.VERSION_MESSAGE)}) + public void smsConsumer(Message message, Channel channel) { + EngineVersion engineVersion = (EngineVersion) messageConverter.fromMessage(message); + log.info("引擎版本消费者接收到消息,消息内容:{}", JSON.toJSONString(engineVersion)); + // 获取消息的id + String messageId = message.getMessageProperties().getMessageId(); + try { + Long count = redisTemplate.opsForSet().add(QueueNameConstants.VERSION_MESSAGE, messageId); + if (count > 0) { + // 正常消费消息 + // 编译 + Map bytecode = RuleEngineUtil.compileVersion(engineVersion); + // 新增或替换规则内容 + ruleEngineVersionFactory.put(engineVersion.getId(),bytecode); + // 消费成功 手动确认 + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + log.info("引擎版本消费者接收到消息,消息内容:{},消费消息成功!", JSON.toJSONString(engineVersion)); + } + } catch (Exception ex) { + log.error("引擎版本消费者接收到消息,消息内容:{},消费消息失败,错误信息:{}", JSON.toJSONString(engineVersion), ex.getMessage()); + // 删除 redis中 添加的消息的id, + redisTemplate.opsForSet().remove(QueueNameConstants.VERSION_MESSAGE, messageId); + // 回退消息 + try { + channel.basicReject(message.getMessageProperties().getDeliveryTag(), true); + } catch (IOException e) { + log.error("引擎版本消费者接收到消息,消息内容:{},消费回退失败,错误信息:{}", JSON.toJSONString(engineVersion), e.getMessage()); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/service/impl/EngineOperationServiceImpl.java b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/service/impl/EngineOperationServiceImpl.java index a899111..3e1cd30 100644 --- a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/service/impl/EngineOperationServiceImpl.java +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/java/com/ruoyi/dataTransform/service/impl/EngineOperationServiceImpl.java @@ -18,6 +18,7 @@ import com.ruoyi.ruleEngine.remote.RemoteRuleEngineService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -77,7 +78,8 @@ public class EngineOperationServiceImpl implements EngineOperationService { // 调用execution方法 Method mainMethod = clazz.getDeclaredMethod("execution"); mainMethod.invoke(clazz.newInstance()); - } catch (Exception e) { + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | + InstantiationException e) { log.info("测试失败,{}",e.getMessage()); //修改测试状态 remoteRuleEngineService.edit(testDataReq.getVersionId(),"0"); @@ -86,11 +88,27 @@ public class EngineOperationServiceImpl implements EngineOperationService { //修改测试状态 remoteRuleEngineService.edit(testDataReq.getVersionId(),"1"); // 处理后的测试数据 - return switch (testDataReq.getScope()) { - case 2 -> DataSetContextHolder.get().getDataSetModel(); - case 3 -> RecordContextHolder.get().getRecordModel(); - case 4 -> DataModelContextHolder.get().getDataModel(); - default -> null; - }; + switch (testDataReq.getScope()) { + case 2 -> { + //获取处理完的数据 + DataSetModel dataSetModel = DataSetContextHolder.get().getDataSetModel(); + //删除线程变量 + DataSetContextHolder.remove(); + return dataSetModel; + } + case 3 -> { + RecordModel recordModel = RecordContextHolder.get().getRecordModel(); + RecordContextHolder.remove(); + return recordModel; + } + case 4 -> { + DataModel dataModel = DataModelContextHolder.get().getDataModel(); + DataModelContextHolder.remove(); + return dataModel; + } + default -> { + return null; + } + } } } diff --git a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/resources/bootstrap.yml index 39fb8b3..8913f72 100644 --- a/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-data_transform/ruoyi-data_transform-server/src/main/resources/bootstrap.yml @@ -4,6 +4,8 @@ server: # Spring spring: + main: + allow-bean-definition-overriding: true application: # 应用名称 name: ruoyi-data-transform @@ -14,11 +16,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml index b698872..d495fd2 100644 --- a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml index edda067..b1dc201 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml index ac77ef6..dd2b4ab 100644 --- a/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/config/RuleEngineApplicationRunner.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/config/RuleEngineApplicationRunner.java index d13a929..5f0a20e 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/config/RuleEngineApplicationRunner.java +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/config/RuleEngineApplicationRunner.java @@ -1,6 +1,7 @@ package com.ruoyi.ruleEngine.client.config; import com.ruoyi.common.core.domain.Result; +import com.ruoyi.ruleEngine.client.util.RuleEngineUtil; import com.ruoyi.ruleEngine.constant.RuleOperationConstants; import com.ruoyi.ruleEngine.domain.EngineVersion; import com.ruoyi.ruleEngine.domain.req.EngineVersionQueryReq; @@ -33,10 +34,8 @@ public class RuleEngineApplicationRunner implements ApplicationRunner { Result> result = remoteRuleEngineService.list(new EngineVersionQueryReq()); if(Result.isSuccess(result)){ result.getData().forEach(engineVersion -> { - // 获取版本内容 - String content = engineVersion.getRuleContent().replaceAll("\r\n", ""); - // 对source进行编译生成class文件存放在Map中,这里用bytecode接收 - Map bytecode = DynamicLoader.compile(engineVersion.getVersionClass() + RuleOperationConstants.FILE_SUFFIX,content ); + // 编译规则内容 + Map bytecode = RuleEngineUtil.compileVersion(engineVersion); // 存入工厂 ruleEngineVersionFactory.put(engineVersion.getId(), bytecode); }); diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/context/DataModelContextHolder.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/context/DataModelContextHolder.java index 8670a08..a169d73 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/context/DataModelContextHolder.java +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/context/DataModelContextHolder.java @@ -1,7 +1,7 @@ package com.ruoyi.ruleEngine.client.context; import com.ruoyi.ruleEngine.client.model.process.DataModelProcessModel; -import com.ruoyi.ruleEngine.client.util.ScopeContextHolderUtil; +import com.ruoyi.ruleEngine.client.util.RuleEngineUtil; import lombok.Data; import lombok.experimental.SuperBuilder; @@ -35,7 +35,7 @@ public class DataModelContextHolder{ } public static void set(Connection connection,String sql){ - ScopeContextHolderUtil.setDataSetContextHolder(connection,sql); + RuleEngineUtil.setDataSetContextHolder(connection,sql); } public static void remove() { diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionDiscard.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionIgnore.java similarity index 53% rename from ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionDiscard.java rename to ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionIgnore.java index b3ea21e..726f4e3 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionDiscard.java +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionIgnore.java @@ -1,10 +1,10 @@ package com.ruoyi.ruleEngine.client.engine.action; /** - * 丢弃动作 - * @ClassName ActionDiscard + * 忽略动作 + * @ClassName ActionIgnore * @Author: 森静若林 * @Date: 2024/5/6 13:48 */ -public class ActionDiscard extends RuntimeException{ +public class ActionIgnore extends RuntimeException{ } diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRecords.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRecords.java new file mode 100644 index 0000000..d96e3e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRecords.java @@ -0,0 +1,10 @@ +package com.ruoyi.ruleEngine.client.engine.action; + +/** + * 记录动作 + * @ClassName ActionRecords + * @Author 森静若林 + * @Date 2024/5/12 22:31 + */ +public class ActionRecords extends RuntimeException{ +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRemove.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRemove.java new file mode 100644 index 0000000..1359d24 --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/engine/action/ActionRemove.java @@ -0,0 +1,10 @@ +package com.ruoyi.ruleEngine.client.engine.action; + +/** + * 移除动作 + * @ClassName ActionRemove + * @Author: 森静若林 + * @Date: 2024/5/6 13:48 + */ +public class ActionRemove extends RuntimeException{ +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/util/ScopeContextHolderUtil.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/util/RuleEngineUtil.java similarity index 75% rename from ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/util/ScopeContextHolderUtil.java rename to ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/util/RuleEngineUtil.java index b4b3425..ca9ecab 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/util/ScopeContextHolderUtil.java +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-client/src/main/java/com/ruoyi/ruleEngine/client/util/RuleEngineUtil.java @@ -1,22 +1,26 @@ package com.ruoyi.ruleEngine.client.util; import com.ruoyi.ruleEngine.client.context.DataSetContextHolder; +import com.ruoyi.ruleEngine.client.dynamicLoad.DynamicLoader; import com.ruoyi.ruleEngine.client.model.DataModel; import com.ruoyi.ruleEngine.client.model.DataSetModel; import com.ruoyi.ruleEngine.client.model.RecordModel; import com.ruoyi.ruleEngine.client.model.process.DataSetProcessModel; +import com.ruoyi.ruleEngine.constant.RuleOperationConstants; +import com.ruoyi.ruleEngine.domain.EngineVersion; import java.sql.*; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** - * 作用域上下文工具 - * @ClassName ScopeContextHolderUtil + * 规则引擎工具 + * @ClassName RuleEngineUtil * @Author 森静若林 * @Date 2024/5/6 20:51 */ -public class ScopeContextHolderUtil { +public class RuleEngineUtil { public static void setDataSetContextHolder(Connection connection,String sql){ List recordModels=new ArrayList<>(); @@ -52,4 +56,10 @@ public class ScopeContextHolderUtil { DataSetContextHolder.set(dataSetProcessModel); } + public static Map compileVersion(EngineVersion engineVersion){ + // 获取版本内容 + String content = engineVersion.getRuleContent().replaceAll("\r\n", ""); + // 对source进行编译生成class文件存放在Map中,这里用bytecode接收 + return DynamicLoader.compile(engineVersion.getVersionClass() + RuleOperationConstants.FILE_SUFFIX,content ); + } } diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-common/src/main/java/com/ruoyi/ruleEngine/constant/QueueNameConstants.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-common/src/main/java/com/ruoyi/ruleEngine/constant/QueueNameConstants.java new file mode 100644 index 0000000..240945a --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-common/src/main/java/com/ruoyi/ruleEngine/constant/QueueNameConstants.java @@ -0,0 +1,13 @@ +package com.ruoyi.ruleEngine.constant; + +/** + * 队列名称常量 + * @ClassName QueueNameConstants + * @Author 森静若林 + */ +public class QueueNameConstants { + + //发送短消息队列名称 + public static final String VERSION_MESSAGE = "send_version_message"; + +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/pom.xml b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/pom.xml index dea8fad..560b595 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/pom.xml +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/pom.xml @@ -91,6 +91,13 @@ mssql-jdbc 9.4.0.jre8 + + + + org.springframework.boot + spring-boot-starter-amqp + 2.6.2 + diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ConfirmFallbackConfig.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ConfirmFallbackConfig.java new file mode 100644 index 0000000..6d2441e --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ConfirmFallbackConfig.java @@ -0,0 +1,51 @@ +package com.ruoyi.ruleEngine.config; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送到 broker 的确认 + * @ClassName: ConfirmFallbackConfig + * @Author: 森静若林 + * @Date: 2024/1/15 + */ + +@Log4j2 +@Component +public class ConfirmFallbackConfig implements RabbitTemplate.ConfirmCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * ConfirmFallbackConfig 初始化的时候执行 设置 rabbitTemplate 发送的回调是 当前类 对象 + */ + @PostConstruct + public void init() { + this.rabbitTemplate.setConfirmCallback(this); + } + + /** + * 消息发送到 broker的回调方法 消息发送成功或者失败都会执行这个方法 + * @param correlationData correlation data for the callback. + * @param ack true for ack, false for nack + * @param cause An optional cause, for nack, when available, otherwise null. + */ + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + if (ack) { + // 消息发送成功 + log.info("消息发送成功"); + } else { + // 消息发送是吧 + log.info("消息发送失败,错误原因:{}", cause); + // 获取到发送失败消息的内容 + } + } + +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitAdminConfig.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitAdminConfig.java new file mode 100644 index 0000000..8c5f47b --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitAdminConfig.java @@ -0,0 +1,53 @@ +package com.ruoyi.ruleEngine.config; + +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * RabbitAdmin是RabbitMQ的一个Java客户端库,它提供了管理RabbitMQ资源的功能。它是通过与RabbitMQ服务器进行交互来执行管理操作的。 + */ +@Configuration +public class RabbitAdminConfig { + + @Value("${spring.rabbitmq.host}") + private String host; + @Value("${spring.rabbitmq.username}") + private String username; + @Value("${spring.rabbitmq.password}") + private String password; + @Value("${spring.rabbitmq.virtualhost}") + private String virtualhost; + + /** + * 构建 RabbitMQ的连接工厂 + * @return + */ + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); + connectionFactory.setAddresses(host); + connectionFactory.setUsername(username); + connectionFactory.setPassword(password); + connectionFactory.setVirtualHost(virtualhost); + // 配置发送确认回调时,次配置必须配置,否则即使在RabbitTemplate配置了ConfirmCallback也不会生效 + connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); + connectionFactory.setPublisherReturns(true); + return connectionFactory; + } + + /** + * 自己初始化 RabbitAdmin + * @param connectionFactory + * @return + */ + @Bean + public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) { + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + rabbitAdmin.setAutoStartup(true); + return rabbitAdmin; + } +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitmqConfig.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitmqConfig.java new file mode 100644 index 0000000..9b03992 --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/RabbitmqConfig.java @@ -0,0 +1,16 @@ +package com.ruoyi.ruleEngine.config; + +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitmqConfig { + // 消息转换配置 + @Bean + public MessageConverter jsonMessageConverter(){ + return new Jackson2JsonMessageConverter(); + } + +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ReturnsFallbackConfig.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ReturnsFallbackConfig.java new file mode 100644 index 0000000..25ebfcf --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/config/ReturnsFallbackConfig.java @@ -0,0 +1,44 @@ +package com.ruoyi.ruleEngine.config; + +import lombok.extern.log4j.Log4j2; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 消息发送打 队列的回调 + * @ClassName: ConfirmFallbackConfig + * @Author: 森静若林 + * @Date: 2024/1/15 + */ +@Log4j2 +@Component +public class ReturnsFallbackConfig implements RabbitTemplate.ReturnsCallback { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * 设置 rabbitTemplate 发送消息到 队列的 回调 使用 ReturnsFallbackConfig + */ + @PostConstruct + public void init() { + this.rabbitTemplate.setReturnsCallback(this); + } + + /** + * 消息发送到队列失败的回调 + * @param returned the returned message and metadata. + */ + @Override + public void returnedMessage(ReturnedMessage returned) { + log.info("消息内容:{},被交换机:{}退回,退回的原因:{}", + returned.getMessage().toString(), returned.getExchange(), returned.getReplyText()); + // TODO 将发送到队列失败的消息 存入到 mysql | redis 后续可以进行补救 或者 先关处理 + } + + +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/controller/EngineVersionController.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/controller/EngineVersionController.java index 850d34a..ff956a4 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/controller/EngineVersionController.java +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/controller/EngineVersionController.java @@ -73,7 +73,7 @@ public class EngineVersionController extends BaseController { @PutMapping("/edit/{id}") @ApiOperation("修改引擎规则版本") public Result edit(@PathVariable Long id, @RequestBody EngineVersionEditReq engineConfigEditReq) { - return toAjax(engineVersionService.updateById(EngineVersion.editBuild(id,engineConfigEditReq, SecurityUtils::getUsername))); + return toAjax(engineVersionService.update(EngineVersion.editBuild(id,engineConfigEditReq, SecurityUtils::getUsername))); } /** diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/queue/NormalQueue.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/queue/NormalQueue.java new file mode 100644 index 0000000..cd4edf9 --- /dev/null +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/queue/NormalQueue.java @@ -0,0 +1,26 @@ +package com.ruoyi.ruleEngine.queue; + +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.UUID; + +/** + * @ClassName NormalQueue + * @Description 普通的队列 + * @Author 森静若林 + * @Date 2024/1/16 18:38 + */ +@Component +public class NormalQueue { + + @Autowired + private RabbitTemplate rabbitTemplate; + + public void sendUUIDMsg(String queueName,T msg){ + rabbitTemplate.convertAndSend(queueName,msg,message -> { + message.getMessageProperties().setMessageId(UUID.randomUUID().toString()); + return message; + }); + } +} diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/EngineVersionService.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/EngineVersionService.java index 1a5eb8d..6abb478 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/EngineVersionService.java +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/EngineVersionService.java @@ -36,4 +36,11 @@ public interface EngineVersionService extends IService { * @return 是否 */ boolean update(Long id, String testStatus); + + /** + * 修改引擎规则版本 + * @param engineVersion 引擎版本 + * @return 是否 + */ + boolean update(EngineVersion engineVersion); } diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/impl/EngineVersionServiceImpl.java b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/impl/EngineVersionServiceImpl.java index 24663ac..ddfd15a 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/impl/EngineVersionServiceImpl.java +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/java/com/ruoyi/ruleEngine/service/impl/EngineVersionServiceImpl.java @@ -5,17 +5,20 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.utils.ObjUtils; import com.ruoyi.ruleEngine.constant.EngineVersionConstants; +import com.ruoyi.ruleEngine.constant.QueueNameConstants; import com.ruoyi.ruleEngine.domain.EngineVersion; import com.ruoyi.ruleEngine.domain.req.VersionClassCreateReq; import com.ruoyi.ruleEngine.domain.resp.EngineConfigScopeResp; import com.ruoyi.ruleEngine.domain.resp.VersionClassCreateResp; import com.ruoyi.ruleEngine.mapper.EngineVersionMapper; +import com.ruoyi.ruleEngine.queue.NormalQueue; import com.ruoyi.ruleEngine.service.EngineConfigService; import com.ruoyi.ruleEngine.service.EngineVersionService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 引擎配置Service业务层处理 @@ -27,6 +30,9 @@ import java.util.List; @Service public class EngineVersionServiceImpl extends ServiceImpl implements EngineVersionService { + @Autowired + private NormalQueue normalQueue; + @Autowired private EngineConfigService engineConfigService; @@ -91,5 +97,31 @@ public class EngineVersionServiceImpl extends ServiceImpl{ + this.renewalEngineVersion(engineVersion.getId()); + }); + return removed; + } + + /** + * 更新引擎版本的class编码 + * @param engineVersionId 引擎版本编号 + */ + public void renewalEngineVersion(Long engineVersionId){ + //查询 + EngineVersion engineVersion = this.getById(engineVersionId); + //发送消息 + normalQueue.sendUUIDMsg(QueueNameConstants.VERSION_MESSAGE,engineVersion); + } } diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/bootstrap.yml index 12b3541..b02e54c 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/file/DataModelContextHolder.txt b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/file/DataModelContextHolder.txt index 8670a08..184d4b9 100644 --- a/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/file/DataModelContextHolder.txt +++ b/ruoyi-modules/ruoyi-rule_engine/ruoyi-rule_engine-server/src/main/resources/file/DataModelContextHolder.txt @@ -1,7 +1,7 @@ package com.ruoyi.ruleEngine.client.context; import com.ruoyi.ruleEngine.client.model.process.DataModelProcessModel; -import com.ruoyi.ruleEngine.client.util.ScopeContextHolderUtil; +import com.ruoyi.ruleEngine.client.util.RuleEngineUtil; import lombok.Data; import lombok.experimental.SuperBuilder; diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml index c05b60f..64fbd9f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml diff --git a/ruoyi-visual/muyu-monitor/src/main/resources/bootstrap.yml b/ruoyi-visual/muyu-monitor/src/main/resources/bootstrap.yml index f12f6d2..e76eafa 100644 --- a/ruoyi-visual/muyu-monitor/src/main/resources/bootstrap.yml +++ b/ruoyi-visual/muyu-monitor/src/main/resources/bootstrap.yml @@ -14,11 +14,11 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 config: # 配置中心地址 - server-addr: 47.98.98.250:8848 + server-addr: 139.224.220.40:8848 namespace: 143f1a53-e544-4782-8667-877c532e2c66 # 配置文件格式 file-extension: yml