diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/websocket/ImWebSocketServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/websocket/ImWebSocketServiceImpl.java index 93642bb..8e67a9f 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/websocket/ImWebSocketServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/websocket/ImWebSocketServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.im.service.websocket; +import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender; import cn.iocoder.yudao.module.im.service.websocket.dto.ImGroupMessageDTO; @@ -8,11 +9,17 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; import java.util.Collection; +// TODO @芋艿:后续要分析下,是不是要拆分下 notify(类似好友、群的变更) /** * IM WebSocket 推送 Service 实现类 + *
+ * 当调用方处于事务中时,推送会延迟到事务提交后再异步执行,
+ * 避免客户端收到 WebSocket 消息时数据库变更尚未可见。
*
* @author 芋道源码
*/
@@ -23,28 +30,75 @@ public class ImWebSocketServiceImpl implements ImWebSocketService {
@Resource
private WebSocketMessageSender webSocketMessageSender;
- @Async
@Override
public void sendPrivateMessageAsync(Long userId, ImPrivateMessageDTO dto) {
+ // 说明:通过 executeAfterCommitOrNow 保证事务提交后再推送,避免客户端收到消息后查询数据库时事务尚未提交
+ // 通过 getSelf() 获取 Spring 代理对象调用 @Async 方法,确保异步 AOP 生效(直接 this 调用会绕过代理)
+ executeAfterTransaction(() -> getSelf().doSendPrivateMessage(userId, dto));
+ }
+
+ @Override
+ public void sendGroupMessageAsync(Collection