在将商户店铺入住申请接口从 alien-store 迁移到 alien-store-platform 的过程中,需要集成 WebSocket 消息推送功能,用于实时通知商户申请已受理。
StoreManageServiceImpl.sendApplicationNotice() 中添加了 WebSocket 消息推送的调用逻辑WebSocketUtil 工具类作为占位实现LifeNotice 表)WebSocketVo 对象alien-store 模块中的 WebSocketProcess 类位于 shop.alien.store.config 包下,alien-store-platform 模块无法直接引用:
// alien-store 中的 WebSocketProcess
@ServerEndpoint(value = "/socket/{sendId}")
public class WebSocketProcess {
public void sendMessage(String id, String message) throws Exception {
// WebSocket 发送逻辑
}
}
alien-store-platform 和 alien-store 是独立的微服务模块alien-store-platform 的 pom.xml 中未引入 alien-store 依赖步骤:
WebSocketProcess.java 从 alien-store 移动到 alien-config 模块shop.alien.config.websocket.WebSocketProcessalien-store 和 alien-store-platform 的 pom.xml 中都引用 alien-config 依赖(已存在)WebSocketUtil 使用共享的 WebSocketProcess优点:
缺点:
alien-store 中的现有代码实现示例:
// alien-config/src/main/java/shop/alien/config/websocket/WebSocketProcess.java
package shop.alien.config.websocket;
@Slf4j
@Component
@ServerEndpoint(value = "/socket/{sendId}")
public class WebSocketProcess {
// ... 原有实现保持不变
}
// alien-store-platform/.../WebSocketUtil.java
package shop.alien.storeplatform.util;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import shop.alien.config.websocket.WebSocketProcess;
@Component
@RequiredArgsConstructor
public class WebSocketUtil {
private final WebSocketProcess webSocketProcess;
public void sendMessage(String receiverId, String message) {
webSocketProcess.sendMessage(receiverId, message);
}
}
步骤:
alien-store-platform 发送消息到 MQalien-store 消费 MQ 消息并通过 WebSocket 推送优点:
缺点:
实现示例:
// alien-store-platform - 生产者
@Component
@RequiredArgsConstructor
public class WebSocketUtil {
private final RabbitTemplate rabbitTemplate;
public void sendMessage(String receiverId, String message) {
WebSocketMessage msg = new WebSocketMessage(receiverId, message);
rabbitTemplate.convertAndSend("websocket.exchange", "websocket.route", msg);
}
}
// alien-store - 消费者
@Component
@RequiredArgsConstructor
public class WebSocketMessageConsumer {
private final WebSocketProcess webSocketProcess;
@RabbitListener(queues = "websocket.queue")
public void handleMessage(WebSocketMessage msg) {
webSocketProcess.sendMessage(msg.getReceiverId(), msg.getMessage());
}
}
步骤:
alien-store 中创建 WebSocket 发送的 REST 接口alien-api 中定义 Feign 客户端接口alien-store-platform 通过 Feign 调用优点:
缺点:
实现示例:
// alien-store - 提供 REST 接口
@RestController
@RequestMapping("/internal/websocket")
public class WebSocketInternalController {
@Autowired
private WebSocketProcess webSocketProcess;
@PostMapping("/sendMessage")
public R sendMessage(@RequestParam String receiverId, @RequestParam String message) {
webSocketProcess.sendMessage(receiverId, message);
return R.success();
}
}
// alien-api - Feign 客户端
@FeignClient(name = "alien-store", path = "/internal/websocket")
public interface WebSocketFeignClient {
@PostMapping("/sendMessage")
R sendMessage(@RequestParam("receiverId") String receiverId,
@RequestParam("message") String message);
}
// alien-store-platform - 使用 Feign
@Component
@RequiredArgsConstructor
public class WebSocketUtil {
private final WebSocketFeignClient webSocketFeignClient;
public void sendMessage(String receiverId, String message) {
webSocketFeignClient.sendMessage(receiverId, message);
}
}
alien-store-platform/src/main/java/shop/alien/storeplatform/util/WebSocketUtil.java
@Slf4j
@Component
public class WebSocketUtil {
public void sendMessage(String receiverId, String message) {
// TODO: 实现WebSocket消息推送
log.info("WebSocketUtil.sendMessage - [占位实现] 准备发送消息: receiverId={}, message={}",
receiverId, message);
log.warn("WebSocketUtil.sendMessage - WebSocket功能未完全实现,消息未实际推送");
}
}
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StoreManageServiceImpl.java
private void sendApplicationNotice(String userAccount) {
// ... 构建通知消息
// 1. 保存通知消息到数据库
lifeNoticeMapper.insert(lifeNotice);
// 2. 通过 WebSocket 实时推送消息
WebSocketVo websocketVo = new WebSocketVo();
websocketVo.setSenderId("system");
websocketVo.setReceiverId(receiverId);
websocketVo.setCategory("notice");
websocketVo.setNoticeType("1");
websocketVo.setIsRead(0);
websocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
try {
webSocketUtil.sendMessage(receiverId, JSONObject.from(websocketVo).toJSONString());
log.info("WebSocket消息推送成功: receiverId={}", receiverId);
} catch (Exception e) {
log.error("WebSocket消息推送失败: {}", e.getMessage(), e);
}
}
采用 方案 3:Feign 调用
alien-store 中添加 WebSocket 发送的内部接口alien-api 中定义 Feign 客户端alien-store-platform 的 WebSocketUtil预计时间: 1-2 小时
采用 方案 1:共享模块
alien-config 的 websocket 子包WebSocketProcess 到共享模块alien-store 和 alien-store-platform 的引用预计时间: 4-8 小时
/storeManage/applyStore 接口提交店铺入住申请life_notice 表是否插入通知记录[INFO ] WebSocketUtil.sendMessage - [占位实现] 准备发送消息: receiverId=store_13800138000
[WARN ] WebSocketUtil.sendMessage - WebSocket功能未完全实现,消息未实际推送
alien-store-platform/src/main/java/shop/alien/storeplatform/util/WebSocketUtil.javaalien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StoreManageServiceImpl.javaalien-store/src/main/java/shop/alien/store/config/WebSocketProcess.javaalien-entity/src/main/java/shop/alien/entity/store/vo/WebSocketVo.javaalien-entity/src/main/java/shop/alien/entity/store/LifeNotice.javalife_notice 表,用户可以在消息列表中查看alien-store 现有的 WebSocket 功能