From 56fdc150906dae903c26bcc1c7e9425a4e7e1cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E8=A8=80?= <2439534736@qq.com> Date: Mon, 13 Oct 2025 15:21:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90rocketMq=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=98=9F=E5=88=97=E6=94=B6=E5=8F=91=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +++- .../xf/basedemo/config/SwaggerGroupApi.java | 16 +++++++- .../controller/business/UserController.java | 15 +++++-- .../interceptor/TokenInterceptor.java | 6 +++ .../xf/basedemo/mq/RocketMqMsgConsumer.java | 25 ++++++++++++ .../xf/basedemo/mq/RocketMqMsgProducer.java | 39 +++++++++++++++++++ .../cn/xf/basedemo/service/UserService.java | 2 + .../service/impl/UserServiceImpl.java | 12 ++++++ 8 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 src/main/java/cn/xf/basedemo/mq/RocketMqMsgConsumer.java create mode 100644 src/main/java/cn/xf/basedemo/mq/RocketMqMsgProducer.java diff --git a/pom.xml b/pom.xml index 9acd99d..ebcfba7 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ 3.19.2 2.11.1 2.0.8 - 5.3 + 5.3 2023.0.1.0 2023.0.1 8.16.0 @@ -128,6 +128,12 @@ elasticsearch-java ${elasticsearch.version} + + + org.apache.rocketmq + rocketmq-spring-boot-starter + 2.3.4 + diff --git a/src/main/java/cn/xf/basedemo/config/SwaggerGroupApi.java b/src/main/java/cn/xf/basedemo/config/SwaggerGroupApi.java index 7648d59..c2eabcd 100644 --- a/src/main/java/cn/xf/basedemo/config/SwaggerGroupApi.java +++ b/src/main/java/cn/xf/basedemo/config/SwaggerGroupApi.java @@ -1,10 +1,13 @@ package cn.xf.basedemo.config; +import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -21,6 +24,8 @@ public class SwaggerGroupApi { @Bean public OpenAPI springShopOpenAPI() { + // 定义全局安全方案名称 + String securitySchemeName = "Authorization"; return new OpenAPI() .info(new Info().title("Spring boot脚手架 API") .description("开箱即用的Spring boot脚手架 API") @@ -29,7 +34,16 @@ public class SwaggerGroupApi { .license(new License().name("Apache 2.0").url("http://springdoc.org"))) .externalDocs(new ExternalDocumentation() .description("Spring boot脚手架 Wiki Documentation") - .url("https://springshop.wiki.github.org/docs")); + .url("https://springshop.wiki.github.org/docs")) // 添加安全组件 + .components(new Components() + .addSecuritySchemes(securitySchemeName, + new SecurityScheme() + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT") + )) + // 将安全方案应用到全局 + .addSecurityItem(new SecurityRequirement().addList(securitySchemeName)); } @Bean diff --git a/src/main/java/cn/xf/basedemo/controller/business/UserController.java b/src/main/java/cn/xf/basedemo/controller/business/UserController.java index 757ab8a..22598ad 100644 --- a/src/main/java/cn/xf/basedemo/controller/business/UserController.java +++ b/src/main/java/cn/xf/basedemo/controller/business/UserController.java @@ -27,28 +27,35 @@ public class UserController { @Operation(summary = "用户登录", description = "用户登录") @PostMapping("/login") - public RetObj login(@RequestBody LoginInfoRes res){ + public RetObj login(@RequestBody LoginInfoRes res) { return userService.login(res); } @Operation(summary = "用户信息", description = "用户信息") @PostMapping("/info") - public RetObj info(){ + public RetObj info() { LoginUser loginUser = SessionContext.getInstance().get(); return RetObj.success(loginUser); } @Operation(summary = "es同步用户信息", description = "用户信息") @GetMapping("/syncEs") - public RetObj syncEs(Long userId){ + public RetObj syncEs(Long userId) { return userService.syncEs(userId); } @Operation(summary = "es查询用户信息", description = "用户信息") @GetMapping("/getEsId") - public RetObj getEsId(Long userId){ + public RetObj getEsId(Long userId) { return userService.getEsId(userId); } + + //发送队列消息 + @Operation(summary = "发送队列消息", description = "发送队列消息") + @GetMapping("/sendMsg") + public RetObj sendMsg(String msg) { + return userService.sendMQMsg(msg); + } } diff --git a/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java b/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java index dc74858..98daf8b 100644 --- a/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java +++ b/src/main/java/cn/xf/basedemo/interceptor/TokenInterceptor.java @@ -49,6 +49,12 @@ public class TokenInterceptor implements HandlerInterceptor { token = request.getParameter("token"); if (StringUtils.isEmpty(token)) { throw new LoginException("请先登录"); + }else { + //验证token + if (!token.startsWith("Bearer ")) { + throw new LoginException(ResponseCode.USER_INPUT_ERROR); + } + token = token.substring(7); } String value = (String) redisTemplate.opsForValue().get("token:" + token); if (StringUtils.isEmpty(value)) { diff --git a/src/main/java/cn/xf/basedemo/mq/RocketMqMsgConsumer.java b/src/main/java/cn/xf/basedemo/mq/RocketMqMsgConsumer.java new file mode 100644 index 0000000..b0f816a --- /dev/null +++ b/src/main/java/cn/xf/basedemo/mq/RocketMqMsgConsumer.java @@ -0,0 +1,25 @@ +package cn.xf.basedemo.mq; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.stereotype.Component; + +/** + * RocketMqMsgComsumer + * + * @author 海言 + * @date 2025/10/13 + * @time 14:37 + * @Description + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = "user-topic",consumerGroup = "consumer-group") +public class RocketMqMsgConsumer implements RocketMQListener { + @Override + public void onMessage(String s) { + log.info("接收到消息---------:{}",s); + } +} diff --git a/src/main/java/cn/xf/basedemo/mq/RocketMqMsgProducer.java b/src/main/java/cn/xf/basedemo/mq/RocketMqMsgProducer.java new file mode 100644 index 0000000..71bdc46 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/mq/RocketMqMsgProducer.java @@ -0,0 +1,39 @@ +package cn.xf.basedemo.mq; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.stereotype.Service; + +/** + * RocketMqMsgProducer + * + * @author 海言 + * @date 2025/10/13 + * @time 14:34 + * @Description + */ +@Slf4j +@Service +public class RocketMqMsgProducer { + + @Resource + private RocketMQTemplate rocketMQTemplate; + + //发送普通消息 + public void sendMsg(String topic, String msg) { + rocketMQTemplate.convertAndSend(topic, msg); + log.info("发送普通消息:{}", msg); + } + + //发送带标签的消息 + public void sendMsg(String topic, String tag, String msg) { + rocketMQTemplate.convertAndSend(topic + ":" + tag, msg); + } + + //发送延迟消息 + public void sendDelayMsg(String topic, String msg, int delayLevel) { + rocketMQTemplate.syncSendDelayTimeMills(topic, msg, delayLevel); + } + +} \ No newline at end of file diff --git a/src/main/java/cn/xf/basedemo/service/UserService.java b/src/main/java/cn/xf/basedemo/service/UserService.java index 7f8dc4f..bf66f8f 100644 --- a/src/main/java/cn/xf/basedemo/service/UserService.java +++ b/src/main/java/cn/xf/basedemo/service/UserService.java @@ -17,4 +17,6 @@ public interface UserService { RetObj syncEs(Long userId); RetObj getEsId(Long userId); + + RetObj sendMQMsg(String msg); } diff --git a/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java b/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java index dde91ad..5191de7 100644 --- a/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java +++ b/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java @@ -12,16 +12,19 @@ import cn.xf.basedemo.config.GlobalConfig; import cn.xf.basedemo.mappers.UserMapper; import cn.xf.basedemo.model.domain.User; import cn.xf.basedemo.model.res.LoginInfoRes; +import cn.xf.basedemo.mq.RocketMqMsgProducer; import cn.xf.basedemo.service.UserService; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RestController; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -49,6 +52,9 @@ public class UserServiceImpl implements UserService { @Autowired private RedisTemplate redisTemplate; + @Resource + private RocketMqMsgProducer rocketMqMsgProducer; + @Override public RetObj login(LoginInfoRes res) { @@ -116,4 +122,10 @@ public class UserServiceImpl implements UserService { } return RetObj.error("es中不存在该用户"); } + + @Override + public RetObj sendMQMsg(String msg) { + rocketMqMsgProducer.sendMsg("user-topic", msg); + return RetObj.success(); + } }