From 0d168cc260b453ca28b3b5a4be911cf2aca6f7aa Mon Sep 17 00:00:00 2001 From: ZiJIe <17738440858@163.com> Date: Mon, 26 May 2025 17:24:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tashow-framework/tashow-framework-mq/pom.xml | 4 + tashow-module/tashow-module-app/pom.xml | 9 +- .../mq/config/BuriedPointConfiguration.java | 114 +++++++++++++++++ .../buriedPoint/BuriedPointConsumer.java | 118 ++++++++++++++++++ .../interceptor/BuriedPointInterceptor.java | 103 +++++++++++++++ .../app/mq/mapper/BuriedPointMapper.java | 10 ++ .../cloud/app/mq/message/BuriedMessages.java | 71 +++++++++++ .../cloud/app/mq/model/BuriedPoint.java | 109 ++++++++++++++++ .../buriedPoint/BuriedPointProducer.java | 49 ++++++++ tashow-module/tashow-module-system/pom.xml | 17 ++- .../cloud/system/SystemServerApplication.java | 2 + 11 files changed, 604 insertions(+), 2 deletions(-) create mode 100644 tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/config/BuriedPointConfiguration.java create mode 100644 tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/consumer/buriedPoint/BuriedPointConsumer.java create mode 100644 tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/interceptor/BuriedPointInterceptor.java create mode 100644 tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/mapper/BuriedPointMapper.java create mode 100644 tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/message/BuriedMessages.java create mode 100644 tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/model/BuriedPoint.java create mode 100644 tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/producer/buriedPoint/BuriedPointProducer.java diff --git a/tashow-framework/tashow-framework-mq/pom.xml b/tashow-framework/tashow-framework-mq/pom.xml index 11b483f..3128466 100644 --- a/tashow-framework/tashow-framework-mq/pom.xml +++ b/tashow-framework/tashow-framework-mq/pom.xml @@ -20,6 +20,10 @@ com.tashow.cloud tashow-data-redis + + org.springframework.boot + spring-boot-starter-amqp + org.springframework.amqp diff --git a/tashow-module/tashow-module-app/pom.xml b/tashow-module/tashow-module-app/pom.xml index e033360..250d8ad 100644 --- a/tashow-module/tashow-module-app/pom.xml +++ b/tashow-module/tashow-module-app/pom.xml @@ -28,7 +28,10 @@ com.tashow.cloud tashow-framework-rpc - + + com.tashow.cloud + tashow-data-mybatis + com.tashow.cloud tashow-framework-web @@ -55,6 +58,10 @@ com.tashow.cloud tashow-framework-security + + org.springframework.boot + spring-boot-starter-actuator + diff --git a/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/config/BuriedPointConfiguration.java b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/config/BuriedPointConfiguration.java new file mode 100644 index 0000000..6cef054 --- /dev/null +++ b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/config/BuriedPointConfiguration.java @@ -0,0 +1,114 @@ +package com.tashow.cloud.app.mq.config; +import com.tashow.cloud.app.mq.interceptor.BuriedPointInterceptor; +import com.tashow.cloud.app.mq.message.BuriedMessages; +import com.tashow.cloud.app.mq.producer.buriedPoint.BuriedPointProducer; +import lombok.RequiredArgsConstructor; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import lombok.extern.slf4j.Slf4j; +import jakarta.annotation.PostConstruct; + +/** + * 埋点功能配置类 + */ +@Slf4j +@Configuration +@RequiredArgsConstructor +public class BuriedPointConfiguration implements WebMvcConfigurer { + + private final BuriedPointProducer buriedPointProducer; + private final RabbitTemplate rabbitTemplate; + + /** + * RabbitTemplate初始化配置 + * 确保回调正确配置,以实现消息可靠性 + */ +// @PostConstruct +// public void initRabbitTemplate() { +// log.info("[埋点配置] 初始化RabbitTemplate: {}", rabbitTemplate); +// rabbitTemplate.setMandatory(true); +// rabbitTemplate.setReturnsCallback(returned -> { +// log.error("[埋点配置] 消息路由失败: exchange={}, routingKey={}, replyCode={}, replyText={}, message={}", +// returned.getExchange(), +// returned.getRoutingKey(), +// returned.getReplyCode(), +// returned.getReplyText(), +// new String(returned.getMessage().getBody())); +// }); +// rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> { +// if (ack) { +// log.debug("[埋点配置] 消息成功发送到交换机: {}", correlationData); +// } else { +// log.error("[埋点配置] 消息发送到交换机失败: cause={}, correlationData={}", cause, correlationData); +// } +// }); +// +// // 验证配置 +// if (rabbitTemplate.isConfirmListener()) { +// log.info("[埋点配置] 确认回调已正确配置"); +// } else { +// log.error("[埋点配置] 确认回调配置失败,请检查RabbitMQ配置!"); +// } +// } + + /** + * 创建埋点队列 + */ + @Bean + public Queue buriedPointQueue() { + return new Queue(BuriedMessages.QUEUE, true, false, false); + } + + /** + * 创建埋点交换机 + */ + @Bean + public DirectExchange buriedPointExchange() { + return new DirectExchange(BuriedMessages.EXCHANGE, true, false); + } + + /** + * 创建埋点绑定关系 + */ + @Bean + public Binding buriedPointBinding() { + return BindingBuilder.bind(buriedPointQueue()) + .to(buriedPointExchange()) + .with(BuriedMessages.ROUTING_KEY); + } + + /** + * 创建埋点拦截器 + */ + @Bean + public BuriedPointInterceptor buriedPointInterceptor() { + return new BuriedPointInterceptor(buriedPointProducer); + } + + /** + * 注册埋点拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册拦截器,拦截所有请求 + registry.addInterceptor(buriedPointInterceptor()) + // 可以根据需要添加或排除特定路径 + .addPathPatterns("/**") + // 排除静态资源、Swagger等路径 + .excludePathPatterns( + "/swagger-ui/**", + "/swagger-resources/**", + "/v3/api-docs/**", + "/webjars/**", + "/static/**", + "/error" + ); + } +} \ No newline at end of file diff --git a/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/consumer/buriedPoint/BuriedPointConsumer.java b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/consumer/buriedPoint/BuriedPointConsumer.java new file mode 100644 index 0000000..3a7d5d0 --- /dev/null +++ b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/consumer/buriedPoint/BuriedPointConsumer.java @@ -0,0 +1,118 @@ +/* +package com.tashow.cloud.app.mq.consumer.buriedPoint; +import com.tashow.cloud.app.mq.mapper.BuriedPointMapper; +import com.tashow.cloud.app.mq.message.BuriedMessages; +import com.tashow.cloud.app.mq.model.BuriedPoint; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.util.Date; +import com.rabbitmq.client.Channel; +*/ +/** + * 埋点消息消费者 + * 将埋点数据存储到数据库 + *//* + +@Component +@RabbitListener(queues = BuriedMessages.QUEUE) +@Slf4j +@RequiredArgsConstructor +public class BuriedPointConsumer { + + private final BuriedPointMapper buriedPointMapper; + + @Value("${spring.application.name:tashow-app}") + private String applicationName; + + */ +/** + * 处理埋点消息 + *//* + + @RabbitHandler + public void onMessage(BuriedMessages message, + Channel channel, + @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) { + try { + log.info("[埋点消费者] 收到埋点消息: {}", message); + + // 确保事件ID不为空 + if (message.getId() == null) { + message.setId((int)(System.currentTimeMillis() % Integer.MAX_VALUE)); + log.warn("[埋点消费者] 消息中的事件ID为空,已自动生成: {}", message.getId()); + } + saveToDatabase(message); + channel.basicAck(deliveryTag, false); + log.info("[埋点消费者] 消息处理成功,已确认"); + + } catch (Exception e) { + try { + channel.basicNack(deliveryTag, false, true); + } catch (IOException ex) { + log.error("[埋点消费者] 拒绝消息失败", ex); + } + } + + } + + + + */ +/** + * 将埋点数据保存到数据库 + *//* + + private void saveToDatabase(BuriedMessages message) { + try { + log.debug("[埋点消费者] 准备保存埋点数据,事件ID: {}", message.getId()); + + // 转换消息为实体 + BuriedPoint buriedPoint = new BuriedPoint(); + + // 设置必填字段,确保不为空 + buriedPoint.setEventId(message.getId()); + buriedPoint.setEventTime(message.getEventTime()); + + // 获取真实用户ID,避免使用默认anonymous + String userId = message.getUserId(); + buriedPoint.setUserId(StringUtils.hasText(userId) && !"null".equals(userId) ? userId : "anonymous"); + + String eventType = message.getEventType(); + buriedPoint.setEventType(eventType); + buriedPoint.setService(applicationName); + + // 设置method字段,确保获取真实方法名 + buriedPoint.setMethod(message.getMethod()); + buriedPoint.setSessionId(message.getSessionId()); + buriedPoint.setClientIp(message.getClientIp()); + buriedPoint.setServerIp(message.getServerIp()); + + // 设置其他字段 + buriedPoint.setPagePath(message.getPagePath()); + buriedPoint.setElementId(message.getElementId()); + buriedPoint.setDuration(message.getDuration()); + + buriedPoint.setCreateTime(new Date()); + + log.debug("[埋点消费者] 埋点实体数据: eventId={}, eventType={}, userId={}, service={}, method={}", + buriedPoint.getEventId(), buriedPoint.getEventType(), + buriedPoint.getUserId(), buriedPoint.getService(), buriedPoint.getMethod()); + + int result = buriedPointMapper.insert(buriedPoint); + + log.info("[埋点消费者] 埋点数据已保存到数据库, 事件ID: {}, 影响行数: {}", message.getId(), result); + } catch (Exception e) { + log.error("[埋点消费者] 保存埋点数据到数据库失败, 事件ID: {}, 错误: {}", + message.getId(), e.getMessage(), e); + } + } +} */ diff --git a/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/interceptor/BuriedPointInterceptor.java b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/interceptor/BuriedPointInterceptor.java new file mode 100644 index 0000000..50b0e98 --- /dev/null +++ b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/interceptor/BuriedPointInterceptor.java @@ -0,0 +1,103 @@ +package com.tashow.cloud.app.mq.interceptor; + +import cn.hutool.core.util.IdUtil; +import com.tashow.cloud.app.mq.message.BuriedMessages; +import com.tashow.cloud.app.mq.producer.buriedPoint.BuriedPointProducer; +import com.tashow.cloud.common.util.json.JsonUtils; +import com.tashow.cloud.common.util.servlet.ServletUtils; +import com.tashow.cloud.common.util.spring.SpringUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StopWatch; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 后端静默埋点拦截器 + * 用于收集API请求信息并异步发送到消息队列 + */ +@Slf4j +@RequiredArgsConstructor +public class BuriedPointInterceptor implements HandlerInterceptor { + + private final BuriedPointProducer buriedPointProducer; + + private static final String ATTRIBUTE_STOPWATCH = "BuriedPoint.StopWatch"; + private static final String ATTRIBUTE_REQUEST_ID = "BuriedPoint.RequestId"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + if (!(handler instanceof HandlerMethod)) { + return true; + } + + try { + // 开始计时 + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + request.setAttribute(ATTRIBUTE_STOPWATCH, stopWatch); + + // 生成请求ID + int requestId = (int)(Math.abs(IdUtil.getSnowflakeNextId()) % Integer.MAX_VALUE); + request.setAttribute(ATTRIBUTE_REQUEST_ID, requestId); + + // 收集埋点数据 + HandlerMethod handlerMethod = (HandlerMethod) handler; + String method = request.getMethod() + " " + request.getRequestURI()+ JsonUtils.toJsonString(request.getParameterMap()); + String controllerName = handlerMethod.getBeanType().getSimpleName(); + String actionName = handlerMethod.getMethod().getName(); + + // 创建埋点消息 + BuriedMessages message = new BuriedMessages(); + message.setId(requestId); + message.setEventTime(System.currentTimeMillis()); + message.setService(SpringUtils.getApplicationName()); + message.setMethod(method); + message.setUserId(getUserId(request)); + message.setSessionId(request.getSession().getId()); + message.setClientIp(ServletUtils.getClientIP(request)); + message.setServerIp(getServerIp()); + message.setEventType("API_REQUEST_START"); + message.setPagePath(controllerName + "#" + actionName); + message.setUserAgent(request.getHeader("User-Agent")); + message.setStatusCode(BuriedMessages.STATUS_INIT); + buriedPointProducer.asyncSendMessage(message); + if (log.isDebugEnabled()) { + log.debug("[埋点] 收集请求开始数据: {}", message); + } + } catch (Exception e) { + log.warn("[埋点] 埋点数据收集异常", e); + } + + return true; + } + + /** + * 获取当前登录用户ID + * 如果未登录返回匿名标识 + */ + private String getUserId(HttpServletRequest request) { + Object userAttribute = request.getSession().getAttribute("USER_ID"); + if (userAttribute != null) { + return userAttribute.toString(); + } + // 返回匿名用户标识 + return "anonymous"; + } + + /** + * 获取服务器IP + */ + private String getServerIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/mapper/BuriedPointMapper.java b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/mapper/BuriedPointMapper.java new file mode 100644 index 0000000..bd56003 --- /dev/null +++ b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/mapper/BuriedPointMapper.java @@ -0,0 +1,10 @@ +package com.tashow.cloud.app.mq.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tashow.cloud.app.mq.model.BuriedPoint; +import org.apache.ibatis.annotations.Mapper; + + +@Mapper +public interface BuriedPointMapper extends BaseMapper { +} \ No newline at end of file diff --git a/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/message/BuriedMessages.java b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/message/BuriedMessages.java new file mode 100644 index 0000000..243fae9 --- /dev/null +++ b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/message/BuriedMessages.java @@ -0,0 +1,71 @@ +package com.tashow.cloud.app.mq.message; +import lombok.Data; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +@Data +public class BuriedMessages implements Serializable { + + // 消息队列配置 + public static final String QUEUE = "BURIED_POINT_QUEUE"; + public static final String EXCHANGE = "BURIED_POINT_EXCHANGE"; + public static final String ROUTING_KEY = "BURIED_POINT_ROUTING_KEY"; + public static final String DEAD_LETTER_EXCHANGE = "DEAD_LETTER_EXCHANGE"; + public static final String DEAD_LETTER_ROUTING_KEY = "DEAD_LETTER_ROUTING"; + public static final String DEAD_LETTER_QUEUE = "DEAD_LETTER_QUEUE"; + + // 状态码定义 + public static final Integer STATUS_INIT = 10; // 初始状态 + public static final Integer STATUS_PROCESSING = 20; // 处理中 + public static final Integer STATUS_SUCCESS = 30; // 处理成功 + public static final Integer STATUS_WARNING = 40; // 处理警告 + public static final Integer STATUS_ERROR = 50; // 处理错误 + + // 通用字段 + private Integer id; // 事件唯一ID + private Long eventTime; // 事件时间戳 + private String service; // 服务名称 + private String method; // 方法/接口 + private String userId; // 用户标识 + private String sessionId; // 会话标识 + private String clientIp; // 客户端IP + private String serverIp; // 服务器IP + + // 添加埋点特定字段 + private String eventType; // 事件类型: PAGE_VIEW, API_CALL, BUTTON_CLICK 等 + private String pagePath; // 页面路径/功能模块 + private String elementId; // 元素标识 + private Long duration; // 操作时长(毫秒) + private String deviceInfo; // 设备信息 + private String userAgent; // 用户代理信息 + private Integer statusCode; // 响应状态码 + private String errorMessage; // 错误信息 + + // 扩展字段,用于存储特定事件的额外数据 + private Map extraData = new HashMap<>(); + + /** + * 快速创建消息的便捷方法 + */ + public static BuriedMessages create(String userId, String eventType, String pagePath) { + BuriedMessages msg = new BuriedMessages(); + msg.setUserId(userId); + msg.setEventType(eventType); + msg.setPagePath(pagePath); + msg.setEventTime(System.currentTimeMillis()); + msg.setStatusCode(STATUS_INIT); // 默认初始状态 + return msg; + } + + /** + * 添加扩展数据 + */ + public BuriedMessages addExtraData(String key, Object value) { + if (this.extraData == null) { + this.extraData = new HashMap<>(); + } + this.extraData.put(key, value); + return this; + } +} diff --git a/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/model/BuriedPoint.java b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/model/BuriedPoint.java new file mode 100644 index 0000000..d6e91ca --- /dev/null +++ b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/model/BuriedPoint.java @@ -0,0 +1,109 @@ +package com.tashow.cloud.app.mq.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 埋点数据实体类 + */ +@Data +@Accessors(chain = true) +@TableName(value = "app_burying") +public class BuriedPoint { + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 事件唯一ID + */ + @TableField(value = "event_id") + private Integer eventId; + + /** + * 事件时间戳 + */ + @TableField(value = "event_time") + private Long eventTime; + + /** + * 服务名称 + */ + @TableField(value = "service") + private String service; + + /** + * 方法/接口 + */ + @TableField(value = "method") + private String method; + + /** + * 用户标识 + */ + @TableField(value = "user_id") + private String userId; + + /** + * 会话标识 + */ + @TableField(value = "session_id") + private String sessionId; + + /** + * 客户端IP + */ + @TableField(value = "client_ip") + private String clientIp; + + /** + * 服务器IP + */ + @TableField(value = "server_ip") + private String serverIp; + + /** + * 事件类型 + */ + @TableField(value = "event_type") + private String eventType; + + /** + * 页面路径/功能模块 + */ + @TableField(value = "page_path") + private String pagePath; + + /** + * 元素标识 + */ + @TableField(value = "element_id") + private String elementId; + + /** + * 操作时长(毫秒) + */ + @TableField(value = "duration") + private Long duration; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private Date createTime; + + + @TableField(value = "update_time") + private Date updateTime; + + @TableField(value = "status") + private Integer status; +} \ No newline at end of file diff --git a/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/producer/buriedPoint/BuriedPointProducer.java b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/producer/buriedPoint/BuriedPointProducer.java new file mode 100644 index 0000000..7130e70 --- /dev/null +++ b/tashow-module/tashow-module-app/src/main/java/com/tashow/cloud/app/mq/producer/buriedPoint/BuriedPointProducer.java @@ -0,0 +1,49 @@ +package com.tashow.cloud.app.mq.producer.buriedPoint; +import com.tashow.cloud.app.mq.message.BuriedMessages; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.UUID; + +/** + * 埋点消息生产者 + */ +@Slf4j +@Component +public class BuriedPointProducer { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * 异步发送完整的埋点消息,并确保消息已被broker接收 + */ + @SneakyThrows + public void asyncSendMessage(BuriedMessages message) { + CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); + // final CompletableFuture confirmFuture = new CompletableFuture<>(); + log.info("[埋点] 异步准备发送消息: {}", message); + correlationData.getFuture().whenComplete((confirm, ex) -> { + log.info("[埋点] 异步消息发送确认回调: {}", message); + if (ex != null) { + log.error("[埋点] 异步消息发送异常: {}", ex.getMessage(), ex); + // confirmFuture.completeExceptionally(ex); + } else if (confirm != null && confirm.isAck()) { + log.info("[埋点] 异步消息发送成功: {}", message); + // confirmFuture.complete(true); + } else { + log.warn("[埋点] 异步消息发送未被ACK"); +//confirmFuture.complete(false); + } + }); + rabbitTemplate.convertAndSend(BuriedMessages.EXCHANGE, BuriedMessages.ROUTING_KEY, message, correlationData); + log.info("[埋点] 异步消息发送完成: {}", message); + // return null; + } +} \ No newline at end of file diff --git a/tashow-module/tashow-module-system/pom.xml b/tashow-module/tashow-module-system/pom.xml index 8fb8203..65c03b2 100644 --- a/tashow-module/tashow-module-system/pom.xml +++ b/tashow-module/tashow-module-system/pom.xml @@ -23,7 +23,10 @@ com.tashow.cloud tashow-framework-env - + + com.tashow.cloud + tashow-framework-mq + com.tashow.cloud @@ -140,6 +143,18 @@ org.dromara.hutool hutool-extra + + junit + junit + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-test + diff --git a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java index 3959eab..04a5497 100644 --- a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java +++ b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java @@ -2,12 +2,14 @@ package com.tashow.cloud.system; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; /** * 项目的启动类 * @author 芋道源码 */ @SpringBootApplication +@EnableAsync // 开启异步 public class SystemServerApplication { public static void main(String[] args) {